zoukankan      html  css  js  c++  java
  • 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;    
    }
  • 相关阅读:
    yum插件yum-fastestmirror
    mysql利用yum安装指定数据存放路径
    快速搭建Seeddms文档管理系统
    Oracle单实例启动多个实例
    HTTP 304状态分析
    Oracle快速克隆安装
    Linux安装SQLite轻量级数据库
    redhat利用yum快速搭建LAMP环境
    将博客搬至CSDN
    GenericServlet 、Servlet和httpServler他们之间的关系
  • 原文地址:https://www.cnblogs.com/staginner/p/2657403.html
Copyright © 2011-2022 走看看