zoukankan      html  css  js  c++  java
  • 数据结构模板

    后缀数组(倍增):

    struct S_array{
        int s[N],sa[N],t[N],t2[N],c[N],n;
        int f[N][20];
        void build_sa(int m){ //字符个数 
            int i,*x=t,*y=t2;
            for(i=0;i<m;i++)c[i]=0;
            for(i=0;i<n;i++)c[x[i]=s[i]]++;
            for(i=1;i<m;i++)c[i]+=c[i-1];
            for(i=n-1;i>=0;i--)sa[--c[x[i]]]=i;
            for(int k=1;k<=n;k<<=1){
                int p=0;
                for(i=n-k;i<n;i++)y[p++]=i;
                for(i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k;
                for(i=0;i<m;i++)c[i]=0;
                for(i=0;i<n;i++)c[x[y[i]]]++;
                for(i=0;i<m;i++)c[i]+=c[i-1];
                for(i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i];
                swap(x,y);
                p=1;x[sa[0]]=0;
                for(i=1;i<n;i++)
                x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
                if(p>=n)break;
                m=p;
            }
        }
        int rank[N],height[N];
        void getHeight(){
            int i,j,k=0;
            for(i=0;i<n;i++)rank[sa[i]]=i;
            for(i=0;i<n;i++){
                if(k)k--;
                int j=sa[rank[i]-1];
                while(s[i+k]==s[j+k])k++;
                height[rank[i]]=k;
            }
        }
        void rmq(){
            for(int i=1;i<n;i++)    f[i][0]=height[i];
            for(int j=1;j<20;j++)
                for(int i=1;i+(1<<j)-1<n;i++)
                    f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
        }
        int lcp(int l,int r){
            int k=log2(r-l+1);
            return min(f[l][k],f[r+1-(1<<k)][k]);
        }
        
    }sa;
    View Code
  • 相关阅读:
    EF Power Tools
    ntsysv命令
    chpasswd 批量更新用户口令
    at定时执行任务命令详解
    shell
    为什么使用 shell 编程
    shell
    redis cluster 3.0
    CSS命名规则规范整理
    log4j:WARN No appenders could be found for logger
  • 原文地址:https://www.cnblogs.com/wmj6/p/11424965.html
Copyright © 2011-2022 走看看