zoukankan      html  css  js  c++  java
  • Manacher [模板]

    • ManacherManacher的作用

    可以快速得到有关 回文子串 的相关信息 . 板子题

    • ManacherManacher的内容

    本质上就是对 暴力的优化 和 现有信息的利用 .

    暴力寻找回文子串, 无非就是枚举 对称轴, 往两边扩展, 时间复杂度 O(N2)O(N^2) .

    manachermanacher 则是在暴力的基础上, 利用了前面已经求出的回文子串信息,

    :具体地说 :

    设 变量 Max_rMax\_r 表示当前回文串所能触及的 最右端点, midmid 表示那个触及 Max_rMax\_r 的回文串 的 中点,
    且当前到了 ii 位置, 要以 ii 为对称轴扩展出所有 连续 回文子串, jjii 关于 midmid对称点,
    hw[i]hw[i] 表示 ii 位置的最长回文串 长度的一半 .

    • iiMax_rMax\_r 代表的回文串内, 则 jj 为对称轴的回文串 Max_rMax\_r 的 “领地” 里的回文长度可以完全 继承ii 位置 .
    • 否则只能暴力扩张 ii 位置 .

    因为 Max_rMax\_r 只扩展到 NN, 所以  O(N)时间复杂度 O(N).

    • ManacherManacher的实现

    很多情况对称轴为 间隙 也要考虑, 此时可以在字符之间插入 特殊字符 后正常 跑 ManacherManacher.
    具体可以看代码 .

    #include<bits/stdc++.h>
    
    const int maxn = 21000005;
    
    int Ans;
    int hw[maxn<<1];
    
    void Manacher(char *s){
            int max_r = 0, mid = 0;
            int len = strlen(s+1);
            for(int i = 1; i <= len; i ++){
                    if(i < max_r) hw[i] = std::min(hw[(mid<<1) - i], max_r-i+1);
                    while(i + hw[i] <= len && i - hw[i] >= 1 && s[i + hw[i]] == s[i - hw[i]]) hw[i] ++;
                    if(i + hw[i] - 1 > max_r) max_r = i + hw[i] - 1, mid = i;
                    Ans = std::max(Ans, hw[i]-1);
            }
    }
    
    char s[maxn], s1[maxn<<1];
    
    int main(){
            scanf("%s", s + 1);
            int len = strlen(s+1);
            for(int i = 1; i <= len<<1; i ++){
                    if(i & 1) s1[i] = '#';
                    else s1[i] = s[i>>1];
            }
            s1[(len<<1)+1] = '#';
            Manacher(s1);
            printf("%d
    ", Ans);
            return 0;
    }
    
    • ManacherManacher的应用

    P1659[]P1659 [国家集训队]拉拉队排练

    P4555[]P4555 [国家集训队]最长双回文串

    P4199P4199 万径人踪灭

  • 相关阅读:
    codeforces 616E. Sum of Remainders 数学
    codeforces 620F. Xors on Segments
    codeforces 417D. Cunning Gena 状压dp
    bzoj 1934 : [Shoi2007]Vote 善意的投票 最小割
    codeforces 628F. Bear and Fair Set 网络流
    codeforces 626E. Simple Skewness 三分
    div嵌套,内层的margin-top会跑到外层
    测试用导航(为了方便在各个测试页面间进行跳转,只需将此js代码引入每个页面即可) V2.0
    ECS_8080端口连接拒绝问题排查
    京东技术架构(二)构建需求响应式亿级商品详情页
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822536.html
Copyright © 2011-2022 走看看