zoukankan      html  css  js  c++  java
  • (模板)Manacher算法模板

    题目链接:https://www.luogu.com.cn/problem/P3805#submit

    题意:给定长为n的字符串,求最大回文子串的长度。(n<=1.1e7)

    思路:

      manacher板子,时间复杂度O(n)。

    AC code:

    /*
     * manacher板子--求最大回文串的长度
     * O(n)
     */
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    const int maxn=11000005;
    int n,ans,p[maxn<<1];
    char ss[maxn],s[maxn<<1];
    
    void init(){
        s[0]='~',s[1]='|';
        for(int i=0;i<n;++i)
            s[2*i+2]=ss[i],s[2*i+3]='|';
        n=2*n+2;
    }
    
    void manacher(){
        int mid=0,r=0;
        for(int i=1;i<n;++i){
            if(i<=r) p[i]=min(p[(mid<<1)-i],r-i+1);
            while(s[i-p[i]]==s[i+p[i]]) ++p[i];
            //暴力扩展,r递增,所以算法是线性的
            if(i+p[i]>r) r=i+p[i]-1,mid=i;
            ans=max(ans,p[i]);
        }
    }
    
    int main(){
        scanf("%s",ss);
        n=strlen(ss);
        init();
        manacher();
        printf("%d
    ",ans-1);
        return 0;
    }
  • 相关阅读:
    课后作业之评价
    课堂作业之寻找水王
    构建之法阅读笔记04
    课下作业
    构建之法阅读笔记03
    学习进度条九
    学习进度条八
    冲刺第五天
    构建之法阅读笔记02
    冲刺第四天
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/12408212.html
Copyright © 2011-2022 走看看