manacher最长回文序列c++

算法真心读不懂

#include <iostream>
#include<string>
#include<cstring>

using namespace std;
char * pre(char *str)
{
int length = strlen(str);
char *prestr = new char[2*length + 4];
prestr[1] = '$';
for(int i=0;i<length;i++)
{
prestr[2*(i+1)] = '#';
prestr[2*(i+1)+1] = str[i];
}
prestr[2*length+2]='#';
prestr[2*length+3]='';
return prestr;
}
int getMaxSym3(char *str)
{
char *prestr = pre(str);
int mx =0, pi=1;//边界和对称中心
int len = strlen(prestr);
//辅助数组
int *p = new int[len];
p[0] = 0;
for(int i=1;i<len;i++)
{
if(mx>i)
{
p[i]=min(mx-i,p[2*pi-i]);//核心
}
else
{
p[i]=1;
}
while(prestr[i-p[i]]==prestr[i+p[i]]&&i-p[i]>0&&i+p[i]<len)
{
p[i]++;
}
if(i+p[i] > mx)
{
mx = p[i] + i;
pi = i;
}
}
//最大回文字符串长度
int maxlen = 0;
for(int i=0;i<len;i++)
{
if(p[i]>maxlen)
{
maxlen = p[i];
}
}
delete []prestr;
delete []p;
return maxlen - 1;
}
int main()
{
string str="sdghfjkghkdfjdfghjklkjhgfdsawtery";
int m=str.length();
char arr[m];
for(int i=0;i<m;i++)
{
arr[i]=str[i];
}
int counts=getMaxSym3(arr);
cout<<counts<<endl;
return 0;
}

原文地址:https://www.cnblogs.com/8335IT/p/5866371.html