参考博客-->manacher算法详解
题目链接-->hdu 3068
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 110005
char s[N],tem[N<<1];
int Len[N<<1];
int manacher(int len)
{
int i,mx=0,id=0,ans=0;
for(i=1; i<=len; i++)//从第一个#到最后一个#的区间
{
if(mx>i) Len[i]=min(Len[2*id-i],mx-i);
else Len[i]=1;
while(tem[i-Len[i]]==tem[i+Len[i]]) Len[i]++;
if(i+Len[i]>mx)
{
mx=i+Len[i];
id=i;
}
ans=max(ans,Len[i]);
}
return ans-1;
}
int main()
{
int len,i;
while(~scanf("%s",s))
{
len=strlen(s);
for(i=1; i<=len; i++)
{
tem[i*2]=s[i-1];
tem[i*2+1]='#';
}
tem[0]='@',tem[1]='#';
len=(len<<1)+1;
tem[len+1]='\0';//非常重要
printf("%d\n",manacher(len));
}
return 0;
}