zoukankan      html  css  js  c++  java
  • hdu3068 最长回文(manacher 算法)

    题意:

              给定字符串。求字符串中的最长回文序列

    解题思路:

              manacher 算法

              时间复杂度:O(N)


    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define MAXN 110010
    using namespace std;
    char b[MAXN],a[MAXN<<1];
    int p[MAXN<<1];
    int n;
    int main(){
        while(scanf("%s",&b[1])!=EOF){
            int i;
            for(i=1;b[i]!='';++i){
                a[(i<<1)]=b[i];
                a[(i<<1)+1]='#';
            }
            a[0]='?';
            a[1]='#';
            n=(i<<1)+2;
            a[n]=0;
            int MaxId,MaxL,id;
            MaxId=MaxL=0;
            memset(p,0,sizeof(p));
            for(int i=1;i<n;++i){
                if(MaxId>i)
                    p[i]=min(p[2*id-i],MaxId-i);
                else
                    p[i]=1;
                while(a[i+p[i]]==a[i-p[i]])
                    p[i]++;
                if(p[i]+i>MaxId)
                {
                    MaxId=p[i]+i;
                    id=i;
                }
                if(p[i]>MaxL)
                    MaxL=p[i];
            }
            printf("%d
    ",MaxL-1);
        }
        return 0;
    }
    


  • 相关阅读:
    和为S的连续正数序列
    数组中只出现一次的数字
    平衡二叉树
    二叉树的深度
    水仙花数
    数列求和
    数值统计
    奇数乘积
    求绝对值
    求两点的距离
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7238321.html
Copyright © 2011-2022 走看看