zoukankan      html  css  js  c++  java
  • luoguP3805 【模板】manacher算法


    luoguP3805 【模板】manacher算法##

      Time Limit: 1 Sec
      Memory Limit: 512 MB

    Description###

       给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
       字符串长度为n
     

    Input###

       一行小写英文字符a,b,c...y,z组成的字符串S
     

    Output###

       一个整数表示答案
     

    Sample Input###

       aaa
     

    Sample Output###

      3
      

    HINT

      字符串长度len <= 11000000

    题目地址:luoguP3805 【模板】manacher算法

    题目大意: 题目很简洁了:)

    题解:

      模板题戳标记
      dalao的解说


    AC代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N=11000005;
    int n,ans,len[N+N];
    char st[N],ch[N+N];
    void modify(){
        int len=0;
        ch[++len]='$';
        for(int i=1;i<=n;i++){
            ch[++len]='#';
            ch[++len]=st[i];
        }
        ch[++len]='#';
        n=len;
    }
    void manacher(){
        modify();
        int mx=0,id;
        for(int i=2;i<=n;i++){
            if(mx>i)len[i]=min(len[id*2-i],mx-i);
            else len[i]=1;
            while(ch[i+len[i]]==ch[i-len[i]])
                len[i]++;
            if(len[i]+i>mx){
                mx=len[i]+i;
                id=i;
            }
        }
    }
    int main(){
        scanf("%s",st+1);
        n=strlen(st+1);
        manacher();
        ans=1;
        for(int i=2;i<=n;i++)
            ans=max(ans,len[i]);
        printf("%d
    ",ans-1);
        return 0;
    }
    


      作者:skl_win
      出处:https://www.cnblogs.com/shaokele/
      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    CStrFun
    CUrl
    CCrawl
    CHttp
    类的实例化
    #include文件时用双引号和尖括号的区别
    对于给定的若干个整数,要求计算它们的和!
    汉诺塔问题
    随机数的生成代码
    排列组合C++
  • 原文地址:https://www.cnblogs.com/shaokele/p/9879553.html
Copyright © 2011-2022 走看看