洛谷 P3809
链接:https://www.luogu.com.cn/problem/P3809
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <math.h>
#define mk make_pair
using namespace std;
const int N = 1e6+10;
int sa[N], tp[N], rk[N], tax[N], hei[N], n, m;
char s[N];
void rsort(){
for(int i = 0; i <= m; i++) tax[i] = 0;
for(int i = 1; i <= n ;i++) tax[rk[tp[i]]]++;
for(int i = 1; i <= m; i++) tax[i] += tax[i-1];
for(int i = n; i >= 1; i--) sa[tax[rk[tp[i]]]--] = tp[i];
}
void getsa(){
for(int i = 1; i <= n; i++) rk[i] = s[i], tp[i] = i;
rsort();
for(int l = 1, k = 1; k < n; l+=l, m = k){
k = 0;
for(int i = n - l +1; i <= n; i++) tp[++k] = i;
for(int i = 1; i <= n; i++) if(sa[i] > l) tp[++k] = sa[i] - l; //这里
rsort(), swap(tp, rk), rk[sa[1]] = k = 1;
for(int i = 2; i <= n; i++)
rk[sa[i]] = (tp[sa[i]] == tp[sa[i-1]] && tp[sa[i] +l] == tp[sa[i-1]+l])? k : ++k;
}
}
int main(){
// cin>> n >> m;
scanf("%s",s+1);
n = strlen(s+1);
m = 122;
getsa();
for(int i = 1; i <= n ; i++) cout<< sa[i] <<' ';
return 0;
}