HDU3068
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
char s[320000];
int len[320000];
int max(int a,int b) {return (a>b?a:b);}
int min(int a,int b) {return (a<b?a:b);}
void manacher(char s[], int len[], int n){
int mx=0,id =1;
for (int i=0,j=0;i< 2*n;++i)
{
len[i]=min(len[2*id-i],mx-i);
for (j=len[i]; (i-j>=0 && i+j+1<2*n) && (s[(i+j+1)/2]==s[(i-j)/2]); j++);
len[i]=j;
if (j+i>mx) mx=j+i,id=i;
}
}
int main()
{
while (scanf("%s\n",s)!=EOF){
scanf("\n");
int n = strlen(s);
manacher(s,len,n);
int ans =0;
for (int i=0;i<2*n;++i){
ans=max(ans,len[i]);
}
cout << ans << endl;
}
return 0;
}
POJ3974
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
char s[3200000];
int len[3200000];
int max(int a,int b) {return (a>b?a:b);}
int min(int a,int b) {return (a<b?a:b);}
void manacher(char s[], int len[], int n){
int mx=0,id =1;
for (int i=0,j=0;i< 2*n;++i)
{
len[i]=min(len[2*id-i],mx-i);
for (j=len[i]; (i-j>=0 && i+j+1<2*n) && (s[(i+j+1)/2]==s[(i-j)/2]); j++);
len[i]=j;
if (j+i>mx) mx=j+i,id=i;
}
}
int main()
{
int t=0;
while (scanf("%s\n",s)!=EOF){
if (strcmp(s,"END")==0) break;
t++;
int n = strlen(s);
manacher(s,len,n);
int ans =0;
for (int i=0;i<2*n;++i){
ans=max(ans,len[i]);
}
printf("Case %d: %d\n",t,ans);
}
return 0;
}