题意:给一个字符串,求连续最长的回文子串的长度。
思路:
Manacher算法(很高效的线性复杂度)。记得上学期看过,这次又做居然全忘了。。。sad,。,。又看了一遍题解才会敲。贴上题解
http://hi.baidu.com/735612658gfy/item/e302f391112dff0b924f4176
代码:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <cstring>
using namespace std;
char tool[2000010];
int ans[2000010];
char s[1000010];
int n;
void pre()
{
tool[0]='%';
tool[1]='#';
n=2;
int str=strlen(s);
for(int i=0;i<str;i++)
{
tool[n++]=s[i];
tool[n++]='#';
}tool[n++]='#';
}
int main()
{
int cas=0;
while(scanf("%s",s)!=EOF)
{
cas++;
if(s[0]=='E')
break;
pre();
int out=0;
int right=0,mi=0;
ans[0]=1;
for(int i=1;i<n;i++)
{
if(i<=right)
ans[i]=min(ans[mi*2-i],right-i+1);
else ans[i]=1;
while(tool[i+ans[i]]==tool[i-ans[i]])
ans[i]++;
if(i+ans[i]-1>right) right=i+ans[i]-1,mi=i;
out=max(out,ans[i]-1);
}
printf("Case %d: %d\n",cas,out);
}
return 0;
}