rt,哪里写错了求大佬查错/kel
//Don't act like a loser.
//You can only use the sode for studying or finding mistakes
//Or,you'll be punished by Sakyamuni!!!
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,w[maxn],sa[maxn],rnk[maxn],a[maxn],b[maxn],cnt[maxn],t[maxn],m;
void bucket_sort(int* x) {
fill(cnt,cnt+m+1,0);
for(int i=1;i<=n;i++) {
cnt[x[i]+1]++;
}
for(int i=1;i<=m;i++) {
cnt[i]+=cnt[i-1];
}
for(int i=1;i<=n;i++) {
t[++cnt[x[sa[i]]]]=sa[i];
}
for(int i=1;i<=n;i++) {
sa[i]=t[i];
}
}
void get_rank() {
m=0;
rnk[sa[1]]=++m;
for(int i=2;i<=n;i++) {
if(a[sa[i]]!=a[sa[i-1]]||b[sa[i]]!=b[sa[i-1]]) {
m++;
}
rnk[sa[i]]=m;
}
}
void suffix_array() {
for(int i=1;i<=n;i++) {
a[i]=w[i];
b[i]=0;
sa[i]=i;
}
bucket_sort(a);
get_rank();
for(int l=1;l<n;l<<=1) {
for(int i=1;i<=n;i++) {
a[i]=rnk[i];
if(i+l<=n) {
b[i]=rnk[i+l];
}
else {
b[i]=0;
}
}
bucket_sort(b);
bucket_sort(a);
get_rank();
}
}
signed main() {
freopen("temp.in","r",stdin);
//freopen(".out","w",stdout);
string s="";
cin>>s;
n=s.size();
for(int i=0;i<n;i++) {
w[i+1]=s[i];
m=max(m,w[i+1]);
}
suffix_array();
for(int i=1;i<=n;i++) {
printf("%d ",sa[i]);
}
//fclose(stdin);
//fclose(stdout);
return 0;
}