manacher算法:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int M=1100010;
char b[M],a[M<<1];
int p[M<<1];
int main()
{
int i,n,id,Maxl,Maxid,ncase=1;
while(~scanf("%s",b))
{
if(strcmp(b,"END")==0) break;
Maxl=Maxid=0;
for(i=0;b[i]!='\0';i++)
{
a[(i<<1)+2]=b[i];
a[(i<<1)+3]='#';
}
a[0]='?'; a[1]='#';
n=(i<<1)+2; a[n]='\0';
Maxid=Maxl=0;
for(i=1;i<n;i++) //核心部分。
{
if(Maxid>i) p[i]=min(p[(id<<1)-i],Maxid-i);
else p[i]=1;
while(a[i+p[i]]==a[i-p[i]]) p[i]++;
if(p[i]+i>Maxid)
{
Maxid=p[i]+i;
id=i;
}
if(p[i]>Maxl) Maxl=p[i];
}
printf("Case %d: ",ncase++);
printf("%d\n",Maxl-1);
}
return 0;
}
hdu 3068 poj 3974