Manacher算法使用,O(n)回文字串算法
#include "cstring"
#include "iostream"
#include "cstdio"
using namespace std;
typedef long long LL;
const int M=55;
const int maxn=2147483648;
//string s;
char s[110000*2+10];
int p[110000*2+10];
int main()
{
while(~scanf("%s",s))
{
//memset(p,0,sizeof(p));
int id=0;
int mx=0;
int l=strlen(s);
int i;
for(i=l; i>=0; i--)
{
s[i+i+2]=s[i];
s[i+i+1]='#';
}
s[0]='*';
//cout<<s<<endl;
// for(int i=0;i<s.length();++i)
// {
// if(a[id]+id>i)
// a[i]
//
//
// }
int ans=0;
for(i=1; i<l*2+1; ++i)
{
if(mx>i) //mx最长匹配
p[i]=min(p[2*id-i],mx-i);
else
p[i]=1;
while(s[i-p[i]] == s[i+p[i]])++p[i];
if(p[i]+i>mx) //update mx id
{
mx=p[i]+i;
id=i;
}
ans=max(p[i]-1,ans); //记录最大回文
}
cout<<ans<<endl;
// for(int i=2; i<2*l+1; ++i)
// {
// if(p[id]+id>i)p[i]=min(p[2*id-i],p[id]+id-i);
// else p[i]=1;
// while(s[i-p[i]] == s[i+p[i]])++p[i];
// if(id+p[id]<i+p[i])id=i;
// if(mx<p[i])mx=p[i];
// }
// cout<<mx-1<<endl;
}
return 0;
}