只放代码啦:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1100000;
int len,p[maxn*2];//p最长回文半径
char str[maxn],b[maxn*2];
inline void prework(void){
int i=0;
for(i=0;str[i];i++)
b[i*2+1]='#',b[(i+1)*2]=str[i];
len=i*2+1;
b[0]='$';//防止越界
b[len]=b[len+1]='#';
}
inline void manacher(void){
int i,id,mx=0,ans=0;//id记录已知的回文子串中右边界最大的子串的中心位置,mx记录其右边界
for(int i=1;i<=len;i++){
p[i]=i<mx?min(mx-i,p[id*2-i]):1;
while(b[i+p[i]]==b[i-p[i]])
p[i]++;
if(p[i]+i>mx)
mx=p[i]+i,id=i;
if(ans<p[i]-1)
ans=p[i]-1;
}
cout<<ans<<endl;
}
signed main(void){
int cnt=0;
while(scanf("%s",str)){
if(str[0]=='E')
break;
printf("Case %d: ",++cnt);
prework();
manacher();
}
return 0;
}
by >o< neighthorn