模板算法题
#include<bits/stdc++.h>
using namespace std;
const int M=5e5+5;
char s[M<<1];
int p[M<<1];
int main(){
cin>>(s+1);
int n=strlen(s+1);
for(int i=2*n+1;i>=1;i--){ //初始化
s[i]=(i&1)? '#':s[i>>1];
}
s[0]='^'; s[2*n+2]='$';
int c=0; int r=0;
for(int i=1;i<=2*n+1;i++){
p[i]=(i<r)?min(p[2*c-i],r-i):1; //min防止越界
while(s[i+p[i]]==s[i-p[i]]) p[i]++; //向两边扩大
if(i+p[i]>r){ //更新更优情况
c=i; r=i+p[i];
}
}
int ans=-1;
for(int i=1;i<=2*n+1;i++){
ans=max(ans,p[i]-1); //p[i]-->回文半径 p[i]-1-->回文子串长度
}
cout<<ans<<'\n';
return 0;
}