zoukankan      html  css  js  c++  java
  • Manacher模板(O(n)内求最长回文串长度)

    转自:https://segmentfault.com/a/1190000008484167

    /*

    由于回文分为偶回文(比如 bccb)和奇回文(比如 bcacb),而在处理奇偶问题上会比较繁琐,所以这里我们使用一个技巧,在字符间插入一个字符(前提这个字符未出现在串里)。举个例子:s="abbahopxpo",转换为s_new="$#a#b#b#a#h#o#p#x#p#o#"(这里的字符 $ 只是为了防止越界,下面代码会有说明),如此,s 里起初有一个偶回文abba和一个奇回文opxpo,被转换为#a#b#b#a##o#p#x#p#o#,长度都转换成了奇数。
      定义一个辅助数组int p[]p[i]表示以s_new[i]为中心的最长回文的半径,例如:

    i0123456789101112131415161718192021
    s_new[i] $ # a # b # b # a # h # o # p # x # p # o #
    p[i]   1 2 1 4 5 2 1 2 1 2 1 2 1 2 1 6 1 2 1 2 1

    可以看出,p[i]-1正好是原字符串中最长回文串的长度。
      Manacher算法之所以快,就快在对 p 数组的求法上有个捷径。在我们解决了奇偶回文的繁琐时,剩下的难点就是求 p 数组,按照普通思维,我们是这样求解的:求解p[i],先初始化p[i]=1,再以s_new[i]为中心判断两边是否相等,相等就p[i]++。这就是普通的思维,但是我们想想,能否让p[i]的初始化不是 1,让它更大点,看下图:

      设置两个变量,mx 和 id 。
      mx 代表以s_new[id]为中心的最长回文最右边界,也就是mx=id+p[id]
      假设我们现在求p[i],也就是以s_new[i]为中心的最长回文半径,如果i<mx,如上图,那么:

     if (i < mx)  
                p[i] = min(p[2 * id - i], mx - i);

    2 * id -i其实就是等于 j ,p[j]表示以s_new[j]为中心的最长回文半径,见上图,因为 i 和 j 关于 id 对称,我们利用p[j]来加快查找。

    */

    时间复杂度:O(n)

    应用:

    求最长回文串长度

    求原串以每个字符为中心的奇数长度回文串的长度

    代码如下:

    //S用来放原串,CS用来放新串
    char S[maxn],CS[maxn<<1];
    int P[maxn];
    int Init(){
        int len=strlen(S);
        CS[0]='$';
        CS[1]='#';
        int cnt=2;
        for(int i=0;i<len;i++){
            CS[cnt++]=S[i];
            CS[cnt++]='#';
        }
        CS[cnt]='';
        return cnt;
    }
    int Manacher(){
        int len=Init();
        int ans=-1;
        int id,mx=0;
        for(int i=1;i<len;i++){
            if(i<mx) P[i]=min(P[2*id-i],mx-i);
            else P[i]=1;
            while(CS[i-P[i]]==CS[i+P[i]]) P[i]++;
            if(mx<i+P[i]){
                id=i;
                mx=i+P[i];
            }
            ans=max(ans,P[i]-1);
        }
        return ans;
    }
    

      

  • 相关阅读:
    docker 的使用
    WEB应用支持RESTFUL风格方法
    tomcat7 安装 windows 服务
    获取POM.XML依赖的JAR包
    集成 dubbo 微服务
    linux 修改yum 为阿里云源
    poj3904
    2013 ACM/ICPC 长春网络赛E题
    2013 ACM/ICPC 长春网络赛F题
    2013 ACM/ICPC 长沙网络赛J题
  • 原文地址:https://www.cnblogs.com/imzscilovecode/p/8057781.html
Copyright © 2011-2022 走看看