Manacher裸题。
#include <cstring>
#include <stdio.h>
#define MAXN 110500
#define min(a,b) (a)<(b)?(a):(b)
using namespace std;
int p[MAXN<<1],id,maxn;
char s[MAXN<<1];
void Manacher(){
int len=strlen(s);
for(int i=len;i>=0;i--){
s[i*2+2]=s[i];
s[i*2+1]='#';
}
s[0]='*';
for(int i=2;i<2*len+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(p[id]+id<p[i]+i)id=i;
if(p[i]>maxn)maxn=p[i];
}
}
int main(){
while(~scanf("%s",s)){
id=0;maxn=0;
memset(p,0,sizeof p);
Manacher();
printf("%d\n",maxn-1);
}
}