这个东西不难,不知道回文自动机咋样,掌握一种简单的写法就好了。
洛谷板子,欢迎来hack
#include <cstdio>
#include <cstring>
int min(int x,int y){return x<y?x:y;}
const int N=22000010;
char s[N],c[N>>1];
int n,a[N],ans;
int main()
{
scanf("%s",c+1);
n=strlen(c+1);
s[0]=s[1]='#';
for(int i=1;i<=n;i++)
s[i*2]=c[i],s[i*2+1]='#';
n=(n<<1)-1;
for(int rig=0,mid,i=1;i<=n;i++)
{
a[i]=i>rig?1:min(rig-i,a[(mid<<1)-i]);
while(s[i-a[i]]==s[i+a[i]]) ++a[i];
--a[i];
if(a[i]+i>rig) rig=a[i]+i,mid=i;
ans=ans>a[i]?ans:a[i];
}
printf("%d
",ans);
return 0;
}