还是一个很短很简单的模板~
Ac Code
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int len;
char s[11000005];
char s2[22000005];
int f[22000005];
int edge=1;
void read()
{
scanf("%s",s);
len=strlen(s);
s2[0]='!';
s2[1]='#';
for(int i=2;i<=len+1;i++)
{
edge++;
s2[edge]=s[i-2];
edge++;
s2[edge]='#';
}
}
void manacher()
{
int mid=1;
f[1]=1;
for(int i=2;i<=edge;i++)
{
f[i]=min(f[mid*2-i],f[mid]+mid-i);
while(f[i]+i<=edge&&s2[i+f[i]]==s2[i-f[i]])
f[i]++;
if(f[i]+i>f[mid]+mid)mid=i;
}
}
void print()
{
int maxx=-1;
for(int i=2;i<=edge;i++)
if(f[i]-1>maxx)maxx=f[i]-1;
printf("%d",maxx);
}
int main()
{
read();
manacher();
print();
return 0;
}