一个很巧妙的算法,manacher。这题直接用模板。
/*HDU3068*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <sstream>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;
const double pi=4.0*atan(1.0);
const int MAXN=200005;
char s[MAXN];
char exts[MAXN<<1];
int p[MAXN<<1];
int slen,extslen;
void init()
{
int i;
for(i=1;s[i]!='\0';i++)
{
exts[i<<1]=s[i];
exts[i<<1|1]='#';
}
exts[0]='$';
exts[1]='#';
extslen=i<<1;
exts[extslen]='\0';
}
void Manacher()
{
int MaxId,id;
int i;
MaxId=id=0;
for(i=1;i<extslen;i++)
{
if(MaxId>i)
{
p[i]=min(p[2*id-i],MaxId-i);
}
else
{
p[i]=1;
}
while(exts[i+p[i]]==exts[i-p[i]])
p[i]++;
if(p[i]+i>MaxId)
{
MaxId=p[i]+i;
id=i;
}
}
}
int main()
{
while(scanf("%s",s+1)!=EOF)
{
init();
Manacher();
int ans=-1;
for(int i=1;i<extslen;i++)
ans=max(ans,p[i]);
printf("%d\n",ans-1);
}
return 0;
}