题目:【模板】后缀排序
思路:
后缀数组模板
yyb巨佬的代码
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 2*1000000
string s; //×Ö·û´®
int n; //×Ö·û³¤¶È
int a[maxn+5]; //ÓÃÕûÐÍ´æ´¢µÄ×Ö·û´®
int t[maxn+5] ={0}; //Í°
int x[maxn+5] ={0},y[maxn+5] ={0}; //µÚÒ»¹Ø¼ü×Ö£¬µÚ¶þ¹Ø¼ü×Ö
int sa[maxn+5] ={0};
bool cmp(int i,int j,int k) {
return y[i]==y[j]&&y[i+k]==y[j+k];
}
void getSA() {
int m=150;
for(int i=1;i<=n;i++) t[x[i]=a[i]]++;
for(int i=1;i<=m;i++) t[i]+=t[i-1];
for(int i=n;i>=1;i--) sa[t[x[i]]--]=i;
for(int k=1;k<=n;k<<=1) {
int p=0;
memset(y,0,sizeof(f));
for(int i=n-k+1;i<=n;i++) y[++p]=i;
for(int i=1;i<=n;i++) if(sa[i]>k) y[++p]=sa[i]-k;
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++) t[x[y[i]]]++;
for(int i=1;i<=m;i++) t[i]+=t[i-1];
for(int i=n;i>=1;i--) sa[t[x[y[i]]]--]=y[i];
swap(x,y);
x[sa[1]]=(p=1);
for(int i=2;i<=n;i++) {
x[sa[i]]=cmp(sa[i],sa[i-1],k)?p:++p;
}
if(p>=n) break;
else m=p;
}
}
int main(){
cin>>s;
n=s.size();
for(int i=1;i<=n;i++) a[i]=s[i-1];
getSA();
for(int i=1;i<=n;i++) printf("%d ",sa[i]);
return 0;
}