• HDU 3068 最长回文


    HDU_3068

        因为做中欧区域赛的题目时,题解有提到Manacher's ALGORITHM,于是就学了一下并找了两个题练练手,一个是HDU_3068还有一个是URAL_1297。推荐一篇讲这个算法讲的感觉挺清楚的博客:http://www.felix021.com/blog/read.php?2040

    View Code // HDU_3068
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define MAXD 220010
    int N, p[MAXD];
    char str[MAXD], b[MAXD];
    void init()
    {
        int i;
        for(i = 0; str[i]; i ++) b[2 * i + 1] = '#', b[2 * i + 2] = str[i];
        N = 2 * i + 1;
        b[0] = '$', b[N] = b[N + 1] = '#';
    }
    void solve()
    {
        int i, id, max = 0, ans = 0;
        for(i = 1; i <= N; i ++)
        {
            p[i] = i < max ? std::min(max - i, p[2 * id - i]) : 1;    
            while(b[i + p[i]] == b[i - p[i]]) ++ p[i];
            if(i + p[i] > max) max = i + p[i], id = i;
            ans = std::max(ans, p[i] - 1);
        }
        printf("%d\n", ans);
    }
    int main()
    {
        while(scanf("%s", str) == 1)
        {
            init();
            solve();    
        }
        return 0;    
    }
    View Code // URAL_1297
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define MAXD 220010
    int N, p[MAXD];
    char str[MAXD], b[MAXD];
    void init()
    {
        int i;
        for(i = 0; str[i]; i ++) b[2 * i + 1] = '#', b[2 * i + 2] = str[i];
        N = 2 * i + 1;
        b[0] = '$', b[N] = b[N + 1] = '#';
    }
    void solve()
    {
        int i, j, k, id, max = 0, ans = 0;
        for(i = 1; i <= N; i ++)
        {
            p[i] = i < max ? std::min(max - i, p[2 * id - i]) : 1;    
            while(b[i + p[i]] == b[i - p[i]]) ++ p[i];
            if(i + p[i] > max) max = i + p[i], id = i;
            if(p[i] - 1 > ans)
                ans = p[i] - 1, k = (i - 1) / 2;
        }
        if(ans & 1) i = k - ans / 2, j = k + ans / 2;
        else i = k - ans / 2, j = k + ans / 2 - 1;
        for(; i <= j; i ++) printf("%c", str[i]);
        printf("\n");
    }
    int main()
    {
        while(scanf("%s", str) == 1)
        {
            init();
            solve();    
        }
        return 0;    
    }
  • 相关阅读:
    从TCP三次握手说起——浅析TCP协议中的疑难杂症
    动态绑定是如何实现的?
    C++对象的内存模型
    C/C++关键字
    libevent库介绍--事件和数据缓冲
    libevent编程疑难解答
    大型工程多个目录下的Makefile写法
    C++中的RAII机制
    C++中的智能指针
    二叉树的非递归遍历
  • 原文地址:https://www.cnblogs.com/staginner/p/2657403.html
Copyright © 2020-2023  润新知