后缀数组

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 #define maxn 100005
 8 int n,m,tot,t1[maxn],t2[maxn],Rank[maxn],sa[maxn],hei[maxn],sum[maxn];
 9 char st[maxn];
10 int main(){
11     scanf("%s",st+1),n=strlen(st+1);
12     int *x=t1,*y=t2;
13     m=256;
14     for (int i=1;i<=m;i++) sum[i]=0;
15     for (int i=1;i<=n;i++) sum[x[i]=st[i]]++;
16     for (int i=1;i<=m;i++) sum[i]+=sum[i-1];
17     for (int i=n;i>=1;i--) sa[sum[x[i]]--]=i;
18     for (int len=1,tot=0;tot<n;len<<=1,m=tot){
19         tot=0;
20         for (int i=n-len+1;i<=n;i++) y[++tot]=i;
21         for (int i=1;i<=n;i++) if (sa[i]>len) y[++tot]=sa[i]-len;
22         for (int i=1;i<=m;i++) sum[i]=0;
23         for (int i=1;i<=n;i++) sum[x[i]]++;
24         for (int i=1;i<=m;i++) sum[i]+=sum[i-1];
25         for (int i=n;i>=1;i--) sa[sum[x[y[i]]]--]=y[i];
26         swap(x,y),tot=0;
27         x[sa[1]]=++tot;
28         for (int i=2;i<=n;i++){
29             if (y[sa[i]]!=y[sa[i-1]]||y[sa[i]+len]!=y[sa[i-1]+len]) ++tot;
30             x[sa[i]]=tot;
31         }
32     }
33     for (int i=1;i<=n;i++) Rank[i]=x[i];
34     memset(hei,0,sizeof(hei));
35     for (int i=1,j=0;i<=n;i++){
36         if (Rank[i]==1) continue;
37         while (st[i+j]==st[sa[Rank[i]-1]+j]) j++;
38         hei[Rank[i]]=j;
39         if (j) j--;
40     }
41     for (int i=1;i<=n;i++) printf("%d\n",sa[i]);
42     return 0;
43 }
View Code

后缀数组模板。

posted @ 2016-07-17 22:22  oyzx~  阅读(124)  评论(0编辑  收藏  举报