https://blog.csdn.net/qq_24451605/article/details/44229907
https://www.felix021.com/blog/read.php?2040
这两个博客写的都相当不错。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 110010
char a[maxn],b[2*maxn];
int p[2*maxn];
int init(int l)
{
b[0]='$';
for(int i=1;i<=2*l;i+=2)
{
b[i]='#';
b[i+1]=a[i/2];
}
b[2*l+1]='#';
b[2*l+2]='\0';
return 2*l+1 ;
}
int main()
{
while(scanf("%s",a)!=EOF)
{
int l;
memset(b,0,sizeof(b));
memset(p,0,sizeof(p));
l=strlen(a);
l=init(l);
int ans=1,mx=0,p0=0;
for(int i=1;i<=l;i++)
{
if(mx>i) p[i]=min(p[2*p0-i],mx-i) ;
else p[i]=1;
while(b[i-p[i]]==b[i+p[i]])
{
p[i]++;
}
if(i+p[i]>mx)
{
mx=i+p[i];
p0=i;
}
ans=max(ans,p[i]);
}
printf("%d\n",ans-1);
}
return 0;
}