zoukankan      html  css  js  c++  java
  • manacher模板

    本文仅是记录manacher算法的一个模板,并不对算法进行详细讲解

    代码中的p数组表示以第i个点为中心所能扩展到的最长回文串,在新的串中首尾加一个不同字符可以防止其无限扩展,对于代码中的p[i]=min(p[id*2-i],maxn-i)表示因为id的左右是回文的所以对称,这里是求现在以i为中心,在目前所能扩展到底最远的范围内最长回文串的长度,之后进行暴力更新,不难得复杂度是O(n)

    代码(hdu3068

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    char s1[310000],s2[310000];
    int len1,len2,p[310000];
    void init(){
          s2[0]='#';
          s2[1]='$';
          for(int i=0;i<len1;i++){
             s2[i*2+2]=s1[i];
             s2[i*2+3]='$';
          }
          len2=len1*2+2;
          s2[len2]='@';
    }
    void horsewithcar(){
          int id=0,maxn=0;
          for(int i=1;i<len2;i++){
               if(maxn>i)p[i]=min(p[id*2-i],maxn-i);
                 else p[i]=1;
               for(;s2[i+p[i]]==s2[i-p[i]];p[i]++)
                  if(i+p[i]>maxn){
                      maxn=i+p[i];
                      id=i;
                  }
          }
    }
    int main()
    {     int n,m,i,j,k;
          while(scanf("%s",s1)!=EOF){//我也不知道为啥hdu上不加!=EOF会tle
              len1=strlen(s1);
              init();
              horsewithcar();
              int ans=0;
              for(i=1;i<len2;i++)
                 ans=max(ans,p[i]);
              cout<<ans-1<<endl;
          }
          return 0;
    }

  • 相关阅读:
    JQuery的ajax函数执行失败,alert函数弹框一闪而过
    ThinkPHP5.1中数据查询使用field方法数组参数起别名时遇到的问题
    Linux Web服务器集群搭建
    三层架构之UI层
    Aircoinst 三层架构ASP.NET开源
    [教程]KALI LINUX 2.0 2019 更新国内源
    工厂模式
    Java 实现序列化和反序列化
    Java实现缓冲流 编码 & 解码
    Java使用IO流读取文件显示到控制台2
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9039497.html
Copyright © 2011-2022 走看看