其实我并没有完全弄懂……所以我写的是自己改编过的。hdu3068过了。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char s[110000 << 2],z[110000 << 2];
int p[110000 << 2],len;
void manacher(){
int id(0),mx(0);
memset(p,0,sizeof(p));
p[0] = 1;
for (int i=1;i<=len;i++){
p[i] = (mx<i) ? 1:min(p[(id << 1)-i],mx-i);
while (s[i-p[i]] == s[i+p[i]] && i-p[i]>=0 && i+p[i]<=len) p[i]++;
if (mx<i+p[i]-1) {mx = i+p[i]-1; id = i;}
}
for (int i=1;i<=len;i++)
if (s[i+p[i]-1]=='*') p[i]--;
}
int main(){
while (scanf("%s",z)!=EOF){
len = strlen(z);
for (int i=0;i<len-1;i++){
s[i << 1] = z[i];
s[i*2+1] = '*';
}
s[(len-1) << 1] = z[len-1];
len = (len << 1)-1;
manacher();
int ans(1);
for (int i=1;i<len;i++)
ans = max(ans,p[i]);
printf("%d\n",ans);
}
return 0;
}