您的位置:首页 > 其它

51nod 1088 最长回文子串

2016-11-06 15:25 267 查看
#include <bits/stdc++.h>
using namespace std;

const int MAXN=200100;
char a[MAXN],s[MAXN];
int f[MAXN],n,ans;

void manacher(char *a)
{
int i,r,p,m;
s[0]='$';s[1]='#';
for(i=1;i<=n;i++)
{
s[i<<1]=a[i-1];
s[i<<1|1]='#';
}
s[(n+1)<<1]='@';
m=(n+1)<<1;
r=p=0;
f[1]=1;
for(i=2;i<m;i++)
{
if(r>i)
f[i]=min(r-i,f[p*2-i]);
else
f[i]=1;
for(;s[i-f[i]]==s[i+f[i]];f[i]++);
if(i+f[i]>r)
{
r=i+f[i];
p=i;
}
}
ans=0;
for(i=2;i<m;i++)
ans=max(ans,f[i]-1);
}

int main()
{
while(scanf(" %s",a)!=EOF)
{
n=strlen(a);
manacher(a);
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod