• HDU 3068 最长回文(Manacher模板题)


    最长回文

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 24164    Accepted Submission(s): 8852


    Problem Description
    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
    回文就是正反读都是一样的字符串,如aba, abba等
     
    Input
    输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
    两组case之间由空行隔开(该空行不用处理)
    字符串长度len <= 110000
     
    Output
    每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
     
    Sample Input
    aaaa abab
     
     
     
    Sample Output
    4 3
     
    Manacher的模板题,一开始准备试试后缀数组的,先用倍增法超时了,然后用dc3还是超时,听说是dc3时间复杂度虽然是O(n)
    但是常数巨大,仍然导致了超时.
    后去去学习了一波 Manacher 
    在理解的基础上抄了一遍模板吧
     
    代码如下:
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int Create(char pszIn[],char pszOut[])
    {
        int nLen=1;
        pszOut[0]='$'; //下标为0,用特殊字符,方便后面的判断
        int i=0;
        while(pszIn[i]!='')
        {
            pszOut[nLen++]='#';//两个字符之间用'#'隔开,使下标从1开始的字符串的长度为奇数
            pszOut[nLen++]=pszIn[i];
            i++;
        }
        pszOut[nLen++]='#';
        pszOut[nLen]=0;
        return nLen;
    }
    void Manacher(int *p,char *str,int len)
    {
      int mx=0,id=0;//id为当前搜索到的点中,右边界最靠右的点的下标,mx为其右边界的下标
      for(int i=0;i<len;i++)
      {
        p[i]=mx>i?min(p[2*id-i],mx-i):1;
        while(str[i+p[i]]==str[i-p[i]])p[i]++;
        if(i+p[i]>mx)
        {
           mx=i+p[i];
           id=i;
        }
      }
    }
    const int MAXN=220010;
    char strIn[MAXN];
    char strOut[MAXN];
    int p[MAXN];
    int main()
    {
        int maxx;
        while(scanf("%s",strIn)!=EOF)
        {
            maxx=0;
            Create(strIn,strOut);
          int  len=strlen(strOut);
            Manacher(p,strOut,len);
            for(int i=0;i<len;i++)
            {
                maxx=max(maxx,p[i]-1);//因为加了特殊字符,所以最后的回文串长度要-1
            }
            printf("%d
    ",maxx);
        }
        return 0;
    }
     
  • 相关阅读:
    前端学PHP之语句
    前端学PHP之运算符
    ASP.NET MVC的TextBoxFor()和TextBox()
    在_Layout模版中使用@Styles.Render()没有效果
    使用HTML.ActionLink实现一个图片链接
    微软最有价值专家大中华峰会花絮视频
    激活当前视图菜单高亮呈现
    获取当前视图名
    Razor语法中链接的一些方法
    Razor语法的一些特殊需求输出
  • 原文地址:https://www.cnblogs.com/a249189046/p/7599737.html
Copyright © 2020-2023  润新知