manacher模板
参见http://www.cnblogs.com/wuyiqi/archive/2012/06/25/2561063.html
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxN = 110005;
char str1[maxN];
char newstr[2*maxN];
int p[2*maxN];
int manacher(char *str)
{
int mx = 0;
int id;
int len = strlen(str);
int max = 0;
for(int i = 1;i<len;i++)
{
if(mx>i)
p[i] = min(p[2*id-i],mx-i);
else
p[i] = 1;
for(;str[i+p[i]]==str[i-p[i]];p[i]++);
if(p[i]>max)
max = p[i];
if(p[i]+i>mx)
{
mx = p[i]+i;
id = i;
}
}
return max;
}
int main()
{
while(scanf("%s",str1)!=EOF)
{
int len = strlen(str1);
newstr[0] = '$';
for(int i = 0;i<=len;i++)
{
newstr[i*2+1] = '#';
newstr[i*2+2] = str1[i];
}
int ans = manacher(newstr);
printf("%d\n",ans-1);
}
return 0;
}