求最大长度回文串
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[210000],s1[220000];
int ans[210000];
int Manacher()
{
int i;
s[0] = '@';
for(i=1;s1[i]!='\0';i++)
{
s[i*2-1] = '#';
s[i*2] = s1[i];
}
s[i*2-1] = '#';
s[i*2] = '\0';
int mx = 0,id = 0,res = 0;
for(int i=1;s[i]!='\0';i++)
{
ans[i] = mx>i?min(ans[2*id-i],mx-i):1;
while(s[i+ans[i]]==s[i-ans[i]])ans[i]++;
if(i+ans[i]>mx)
{
id = i;
mx = id+ans[id];
}
res = max(ans[i],res);
}
return res-1;
}
int main()
{
while(scanf("%s",s1+1)!=EOF)
{
printf("%d\n",Manacher());
}
return 0;
}