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
  • 相关阅读:
    Mycat之按照时间进行分片
    Mysql binlog解析器
    字体属性和文本属性总结
    css选择器
    CSS的三种引入方式
    CSS样式语法
    应用程序与数据库结合使用的三种方式
    存储过程
    子查询
    多表查询
  • 原文地址:https://www.cnblogs.com/wmj6/p/11424965.html
Copyright © 2011-2022 走看看