51nod1089---最长回文子串 V2(51nod基础:Manacher算法)

来源:互联网 发布:微商做图软件有哪些 编辑:程序博客网 时间:2024/09/21 06:18

【题目来源】:https://www.51nod.com
【题意&&思路】
刚才为了做这个题,就去学了下Manacher算法,这种算法是以线性的时间复杂度,前后只需要匹配没有匹配过的,这里放下一篇比较易懂的博客,Manacher算法详解,。
【代码】

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn=1000010;char str[maxn];//原字符串char tmp[maxn<<1];//转换后的字符串int Len[maxn<<1];//转换原始串int INIT(char *st){    int i,len=strlen(st);    tmp[0]='@';//字符串开头增加一个特殊字符,防止越界    for(i=1;i<=2*len;i+=2)    {        tmp[i]='#';        tmp[i+1]=st[i/2];    }    tmp[2*len+1]='#';    tmp[2*len+2]='$';//字符串结尾加一个字符,防止越界    tmp[2*len+3]=0;    return 2*len+1;//返回转换字符串的长度}//Manacher算法计算过程int MANACHER(char *st,int len){     int mx=0,ans=0,po=0;//mx即为当前计算回文串最右边字符的最大值     for(int i=1;i<=len;i++)     {         if(mx>i)         Len[i]=min(mx-i,Len[2*po-i]);//在Len[j]和mx-i中取个小         else         Len[i]=1;//如果i>=mx,要从头开始匹配         while(st[i-Len[i]]==st[i+Len[i]])         Len[i]++;         if(Len[i]+i>mx)//若新计算的回文串右端点位置大于mx,要更新po和mx的值         {             mx=Len[i]+i;             po=i;         }         ans=max(ans,Len[i]);     }     return ans-1;//返回Len[i]中的最大值-1即为原串的最长回文子串额长度}int main(){    scanf("%s",str);    int len=INIT(str);    int ans=MANACHER(tmp,len);    printf("%d\n",ans);}
阅读全文
0 0
原创粉丝点击