求最长回文子串的长度
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAX=1e6+5;
const long long P=131;
long long power[MAX],ha1[MAX],ha2[MAX];
char s[MAX];
int L;
bool check(int l1,int r1,int l2,int r2)
{
long long tmp1=ha1[r1]-ha1[l1-1]*power[r1-l1+1];
long long tmp2=ha2[r2]-ha2[l2+1]*power[l2+1-r2];
return tmp1==tmp2;
}
int main()
{
int t=0;
power[0]=1;for(int i=1;i<MAX-1;++i) power[i]=power[i-1]*P;
while(~scanf("%s",s+1))
{
if(s[1]=='E') break;
L=strlen(s+1);
ha1[0]=ha2[L+1]=0;
for(int i=1;i<=L;++i) ha1[i]=ha1[i-1]*P+s[i]-'a';
for(int i=L;i>=1;--i) ha2[i]=ha2[i+1]*P+s[i]-'a';
int mx=1,l,r,ans;//奇数
for(int i=1;i<=L;++i)
{
l=1;r=min(i-1,L-i);ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(i-mid,i-1,i+mid,i+1))
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
mx=max(mx,2*ans+1);
if(s[i]!=s[i+1]) continue;//偶数
l=1;r=min(i-1,L-i-1);ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(i-mid,i-1,i+1+mid,i+2))
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
mx=max(mx,2*(ans+1));
}
printf("Case %d: %d\n",++t,mx);
}
return 0;
}