zoukankan      html  css  js  c++  java
  • Manacher算法

    对于求最长回文子串问题,暴力解法的时间复杂度是O(n3);

    好一点的算法从每个点向两边扩展也要O(n2)的复杂度;

    Manacher算法用p[i]数组记录以i为对称轴的回文串的右端到i的距离以及一个maxright标志,利用了回文串的对称性,使每个点只要处理一遍,因此复杂度降到了O(n)。

    模板:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e5 + 5;
     4 int p[2*maxn+50];
     5 char s[2*maxn+50];
     6 
     7 int main() {
     8     s[0] = '$', s[1] = '#';
     9     int len = 1, maxright = 0, pos = 0;
    10     char ch;
    11     while ((ch = getchar()) != '
    ') {
    12         s[++len] = ch;
    13         s[++len] = '#';
    14     }
    15     for (int i = 2; i <= len; ++i) {
    16         if (i < maxright) p[i] = min(p[2*pos-i], maxright-i);
    17         else p[i] = 1;
    18         while (s[i-p[i]] == s[i+p[i]]) ++p[i];
    19         if (i+p[i] > maxright) {
    20             maxright = i+p[i];
    21             pos = i;
    22         }
    23     }
    24     int ans = 0;
    25     for (int i = 2; i <= len; ++i)
    26         ans = max(ans, p[i]-1);
    27     cout << ans << endl;
    28 
    29     return 0;
    30 }
  • 相关阅读:
    jar命令
    python的实例方法,类方法和静态方法区别
    修饰器学习
    人生感悟的句子
    html+css学习
    url编码
    正向代理和反向代理
    web基础
    dns解析域名过程
    关于csrf
  • 原文地址:https://www.cnblogs.com/robin1998/p/6533172.html
Copyright © 2011-2022 走看看