• Manacher 算法 模板(求一个字符串的最长回文串)


    Manacher 算法:

    用于找一个长串中的最长回文串。

    思路是把奇数或偶数的字符串都转换成奇数的字符串然后处理。

    遍历,记录每一次能到达的最右和这个中心轴,利用一个数组记录中心点到最右端的距离。每次更新它的值和这个中心轴。

    1.3.3 Calf Flac

    Time Limit: 1 Sec  Memory Limit: 64 MB
    Submit: 239  Solved: 45
    [Submit][Status][Forum]

    Description

    据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去寻找这些牛制造的奇观(最棒的回文)。 在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'A'-'Z'和'a'-'z'。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。 我们将保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。

    Input

    输入文件不会超过20,000字符。这个文件可能一行或多行,但是每行都不超过80个字符(不包括最后的换行符)。

    Output

    输出的第一行应该包括找到的最长的回文的长度。 下一行或几行应该包括这个回文的原文(没有除去标点符号、空格),把这个回文输出到一行或多行(如果回文中包括换行符)。 如果有多个回文长度都等于最大值,输出最前面出现的那一个。

    Sample Input

    Confucius say: Madam, I'm Adam.

    Sample Output

    11
    Madam, I'm Adam
    
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #include<map>
    #include<cmath>
    using namespace std;
    string b;
    string manacher()
    {
        string str="!@";
        int i;
        int b1=b.size();
        for(i=0; i<=b1-1; i++)
        {
            str+=b[i];
            str+='@';
        }
        str+='!';
        int r=0,mid=0,maxx=0;
        int str1=str.size();
        int p[200010]= {0} ;
        for(i=1; i<=str1-2; i++)
        {
            if(i<r)
                p[i]=(p[2*mid-i]<(r-i)?p[2*mid-i]:(r-i));
            else
                p[i]=1;
            while(str[i-p[i]]==str[i+p[i]])
                p[i]++;
            if(i+p[i]>r)
            {
                r=i+p[i];
                mid=i;
            }
        }
        for(i=1; i<=str1-2; i++)
        {
            if(maxx<p[i])
            {
                maxx=p[i];
                mid=i;
            }
        }
        maxx--;
        int s=mid-maxx;
        int e=mid+maxx;
    
        string result;
        for(i=s; i<=e; i++)
        {
            if(str[i]!='@'&&str[i]!='!')
                result+=str[i];
        }
        return result;
    }
    int main()
    {
        char a[20010]= {0};
        char c;
        int wei[20010]= {0},i,tt=0,z=0;
        while(~(c=getchar()))
        {
            a[z++]=c;
        }
        int a1=strlen(a);
        b.clear();
        z=0;
        for(i=0; i<=a1-1; i++)
        {
            if('A'<=a[i]&&a[i]<='Z')
            {
                b+=a[i]+32;
                wei[tt++]=z;
    
            }
            if('a'<=a[i]&&a[i]<='z')
            {
                b+=a[i];
                wei[tt++]=z;
    
            }
            z++;
        }
        string result=manacher();
        int s=b.find(result);
        int ans=result.size();
        int e=s+result.size()-1;
        printf("%d
    ",ans);
        for(i=wei[s]; i<=wei[e]; i++)
            printf("%c",a[i]);
        putchar('
    ');
    
    
    
    }
  • 相关阅读:
    elasticsearch + fluentd + kibana 日志收集
    redis-dump数据导入导出
    zabbix 存储数据清理
    etcd集群部署
    yum安装zabbix4.2
    U盘启动安装CentOS 7出现 -dracut initqueue timeout
    About && 友链
    红队-C2 Server基础构建
    从0学习WebLogic CVE-2020-2551漏洞
    代码审计-phpok框架5.3注入漏洞
  • 原文地址:https://www.cnblogs.com/bhd123/p/9664570.html
Copyright © 2020-2023  润新知