直接上模板:
#include <bits/stdc++.h>
using namespace std;
const int maxn=110000*2+100;
char s1[maxn],s2[maxn];
int Len[maxn];
int init(int len){
s2[0]='@';
s2[1]='#';
for(int i=0;i<len;i++){
s2[i*2+2]=s1[i];
s2[i*2+3]='#';
}
s2[len*2+2]='$';
s2[len*2+3]=0;
return len*2+2;
}
int manacher(int len){
int mx=0,po=0; //目前最长回文字串的末尾与中间位置
int ans=0;
for(int i=1;i<len;i++){
if(i<mx) Len[i]=min(Len[2*po-i],mx-i);
else Len[i]=1;
while(s2[i+Len[i]]==s2[i-Len[i]]) Len[i]++;
if(mx<i+Len[i]) mx=i+Len[i],po=i;
ans=max(ans,Len[i]-1);
}
return ans;
}
int main(){
while(scanf("%s",s1)!=EOF){
int len=strlen(s1);
int len2=init(len);
printf("%d\n",manacher(len2));
}
}