后缀数组模板一份

 1 /******************
 2     by zhuyuqi      *
 3     QQ:1113865149 *
 4     name:2-sat    *
 5                   *
 6 ******************/
 7 
 8 using namespace std;
 9 const int MAX = 1000;
10 int r[MAX],*rank;
11 int wa[MAX],wb[MAX],ws[MAX],wv[MAX];
12 int height[MAX];
13 char str[MAX];
14 int cmp(int *r,int a,int b,int d) {
15     return r[a]==r[b]&&r[a+d]==r[b+d];
16 }
17 
18 void build_sa(int *r,int *sa,int n,int m) {
19     int *x=wa,*y=wb,*t;
20     for(int i=0;i<m;i++) ws[i]=0;
21     for(int i=0;i<n;i++) ws[x[i]=r[i]]++;
22     for(int i=1;i<m;i++) ws[i]+=ws[i-1];
23 
24     for(int i=0,j=1,p=1;p<n;j*=2,m=p) {
25         for(i=n-j,p=0;i<n;i++) y[p++]=i;
26         for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
27         for(i=0;i<n;i++) wv[i]=x[y[i]];
28 
29         for(i=0;i<m;i++) ws[i]=0;
30         for(i=0;i<n;i++) ws[wv[i]]++;
31         for(i=1;i<m;i++) ws[i]+=ws[i-1];
32         for(i=n-1;i>=0;i--) sa[--ws[wv[i]]] = y[i];
33 
34         for(p=1,i=1,t=x,x=y,y=t,x[sa[0]]=0;i<n;i++)
35         x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
36 
37 
38     }
39 
40     return ;
41 }
42 
43 void getHight(int *r,int *sa,int n) {   //two - point
44     int h=0;
45     for(int i=0;i<n;i++)  rank[sa[i]]=i;
46     for(int i=0;i<n;i++) {
47         if(h) h--;
48         int j=sa[rank[i]-1];
49         while(str[i+h]==str[j+h]) h++;
50         height[rank[i]]=h;
51     }
52 }
53 
54 int main() {
55 }
原文地址:https://www.cnblogs.com/acvc/p/3759976.html