poj3974(最长回文串)(Manacher算法)

来源:互联网 发布:网络借贷平台风险 编辑:程序博客网 时间:2024/06/15 21:13
题意:给一个字符串,求连续最长的回文子串的长度。

思路: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;}

0 0