zoukankan      html  css  js  c++  java
  • 后缀数组模板

     1 const int maxn=50010;
     2 int r[maxn],Wa[maxn],Wb[maxn],Wv[maxn],Ws[maxn],rank[maxn],lcp[maxn],sa[maxn];
     3 
     4 bool cmp(int *p,int i,int j,int l)
     5 {return p[i]==p[j]&&p[i+l]==p[j+l];} 
     6 
     7 void DA(int n,int m)
     8 {
     9     int i,j,p,*x=Wa,*y=Wb;
    10     for(i=0;i<m;i++)Ws[i]=0;
    11     for(i=0;i<n;i++)++Ws[x[i]=r[i]];
    12     for(i=1;i<m;i++)Ws[i]+=Ws[i-1];
    13     for(i=n-1;i>=0;i--)sa[--Ws[x[i]]]=i;
    14     
    15     for(j=1,p=1;p<n;m=p,j<<=1)
    16     {
    17         for(p=0,i=n-j;i<n;i++)y[p++]=i;
    18         for(i=0;i<n;i++)
    19             if(sa[i]>=j)
    20                 y[p++]=sa[i]-j;
    21         for(i=0;i<m;i++)Ws[i]=0;
    22         for(i=0;i<n;i++)Wv[i]=x[y[i]];
    23         for(i=0;i<n;i++)++Ws[Wv[i]];
    24         for(i=1;i<m;i++)Ws[i]+=Ws[i-1];
    25         for(i=n-1;i>=0;i--)sa[--Ws[Wv[i]]]=y[i];
    26         for(swap(x,y),x[sa[0]]=0,i=1,p=1;i<n;i++)
    27             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;        
    28     }
    29 }
    30 
    31 void LCP(int n)
    32 {
    33     int i,j,k=0;
    34     for(i=1;i<=n;i++)rank[sa[i]]=i;
    35     for(i=0;i<n;lcp[rank[i++]]=k)
    36         for(k=k?k-1:k,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
    37 }
    尽最大的努力,做最好的自己!
  • 相关阅读:
    HelloJava.java
    建表
    JAVA连接数据库
    数据查询
    时间片轮转法
    最高优先级
    进程调度
    磁盘调度管理
    Fibonacci数列
    众数问题
  • 原文地址:https://www.cnblogs.com/TenderRun/p/5199322.html
Copyright © 2011-2022 走看看