zoukankan      html  css  js  c++  java
  • [51Nod1089] 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
     
    回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
    输入一个字符串Str,输出Str里最长回文子串的长度。
     
    Input
    输入Str(Str的长度 <= 100000)
    Output
    输出最长回文子串的长度L。
    Input示例
    daabaac
    Output示例
    5
    思路
    manacher算法;
    学习学习↓
    代码实现
     1 #include<cstdio>
     2 #include<cstring>
     3 const int maxn=3e6+10;
     4 inline int max_(int x,int y){return x>y?x:y;}
     5 inline int min_(int x,int y){return x<y?x:y;}
     6 int l,len,p[maxn];
     7 char s[maxn],os[maxn];
     8 int ans,id,mx=-1;
     9 void manachar(){
    10     for(int i=1;i<l;i++){
    11         if(id+mx>i) p[i]=min_(p[id*2-i],id+mx-i);
    12         while(i-p[i]-1>=0&&i+p[i]+1<=l&&os[i-p[i]-1]==os[i+p[i]+1]) p[i]++;
    13         if(id+mx<i+p[i]) id=i,mx=p[i];
    14         ans=max_(ans,p[i]);
    15     }
    16 }
    17 int main(){
    18     scanf("%s",s);
    19     len=strlen(s),l=-1;
    20     for(int i=0;i<len;i++) os[++l]='#',os[++l]=s[i];
    21     os[++l]='#';
    22     manachar();
    23     printf("%d
    ",ans);
    24     return 0;
    25 }
  • 相关阅读:
    Web基础 网页的血肉CSS
    18
    19
    20
    17
    16
    15
    13
    14
    12
  • 原文地址:https://www.cnblogs.com/J-william/p/7077940.html
Copyright © 2011-2022 走看看