• L2-008 manacher 的应用


      附上题目链接:https://www.patest.cn/contests/gplt/L2-008

      

    对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。

    输入格式:

    输入在一行中给出长度不超过1000的非空字符串。

    输出格式:

    在一行中输出最长对称子串的长度。

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    const int maxn = 3*1000 + 100;
    char s[maxn];
    char a[maxn];
    int p[maxn];
    
    void manacher(char *s) {
        int len = strlen(s+1);
        int m = 2*len + 1;
        for(int i=1; i<=len; i++) {
            a[i<<1] = s[i];
            a[i<<1|1] = '#';
        }
        a[0] = '+'; a[1] = '#'; a[m+1] = '-';
        int mx = 0, idx;
        for(int i=1; i<=m; i++) {
            if(mx > i) p[i] = min(p[2*idx-i], mx-i);
            else p[i] = 1;
            for(; a[i-p[i]]==a[i+p[i]]; p[i]++);
            if(p[i]+i>mx) mx=p[i]+i, idx = i;
        }
    }
    
    int main() {
        gets(s+1);
        manacher(s);
        int res = 0;
        int len = strlen(s+1);
        for(int i=1; i<=2*len+1; i++) {
            res = max(res, p[i]);
        }
        printf("%d
    ", res-1);
        return 0;
    }
  • 相关阅读:
    Bash的提示符
    小笨霖英语笔记本(5)
    什么是VLAN
    阅读笔记:双核心Opteron处理器
    小笨霖英语笔记本(4)
    搭乘CCNUMA快车
    得到tnsnames.ora文件的位置 zz
    关于64位Windows操作系统中的注册表 zz
    Temp.Misc
    HttpHandler HttpModule入门篇
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5557861.html
Copyright © 2020-2023  润新知