O(n)的最长回文子串,留一个模板...
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=1000010<<1;
int n,m;
int p[maxn];
char in[maxn],in2[maxn];
void init()
{
in2[0]='$';
m=1;
for (int i=0; in[i]; i++)
{
in2[m++]='#';
in2[m++]=in[i];
}
in2[m]='#';
in2[m+1]='@';
}
void slove(int &ans)
{
for (int i=1; i<=m; i++) p[i]=0;
p[1]=1;
int mx_right=1;
int mx_center=1;
ans=1;
for (int i=2; i<=m; i++)
{
if (mx_right>i)
{
p[i]=min(mx_right-i+1,p[2*mx_center-i]);
}
else
{
p[i]=1;
}
while(in2[i-p[i]]==in2[i+p[i]]) p[i]++;
if (i+p[i]-1>mx_right)
{
mx_right=i+p[i]-1;
mx_center=i;
}
if (p[i]>ans) ans=p[i];
}
}
int main()
{
// freopen("in.txt","r",stdin);
int cnt=0;
int ans=0;
while(~scanf("%s",in))
{
if (strcmp(in,"END")==0) break;
init();
ans=0;
slove(ans);
printf("Case %d: %d\n",++cnt,ans-1);
}
return 0;
}