• POJ (Manacher) Palindrome


    多敲几个模板题,加深一下对Manacher算法的理解。

    这道题给的时间限制15s,是我见过的最长的时间的了。看来是为了让一些比较朴素的求最大回文子串的算法也能A过去

    Manacher算法毕竟给力,运行时间200+MS

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 1000000 + 100;
     9 char s1[maxn], s2[maxn * 2];
    10 int p[maxn * 2];
    11 
    12 void Init(void)
    13 {
    14     s2[0] = '$', s2[1] = '#';
    15     int j = 2;
    16     for(int i = 0; s1[i] != ''; ++i)
    17     {
    18         s2[j++] = s1[i];
    19         s2[j++] = '#';
    20     }
    21     s2[j] = '';
    22 }
    23 
    24 void manacher(char s[])
    25 {
    26     int id, mx = 0;
    27     p[0] = 0;
    28     for(int i = 1; s[i] != ''; ++i)
    29     {
    30         if(mx > i)
    31             p[i] = min(p[id*2-i], mx-i);
    32         else
    33             p[i] = 1;
    34         while(s[i + p[i]] == s[i - p[i]])
    35             ++p[i];
    36         if(i + p[i] > mx)
    37         {
    38             mx = i + p[i];
    39             id = i;
    40         }
    41     }
    42 }
    43 
    44 int getans(void)
    45 {
    46     int ans = 1;
    47     for(int i = 1; s2[i] != ''; ++i)
    48         ans = max(ans, p[i] - 1);
    49     return ans;
    50 }
    51 
    52 int main(void)
    53 {
    54     #ifdef LOCAL
    55         freopen("3974in.txt", "r", stdin);
    56     #endif
    57 
    58     int kase = 1;
    59     while(scanf("%s", s1) != EOF)
    60     {
    61         if(s1[0] == 'E')    break;
    62         Init();
    63         manacher(s2);
    64         printf("Case %d: %d
    ", kase++, getans());
    65     }
    66     return 0;
    67 }
    代码君
  • 相关阅读:
    Vue学习路线
    国庆游
    Axure RP 9 Beta 开放下载(更新激活密钥和汉化包)
    python虚拟环境
    异步任务神器 Celery-入门
    pymysql操作mysql
    安装 RabbitMQ
    GIT工作流
    flask入门与发送邮件与QQ邮箱
    Mysql第一周
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3920350.html
Copyright © 2020-2023  润新知