/// Tested Code at: https://j...content-available-to-author-only...o.jp/submission/318835
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct SuffixArray{
int lenS; string s;
int rnk[N],sa[N],lcp[N];
int cntr,cnts,rnk2[N];
int head[N],lst[N],nxt[N];
void push(int id, int val){
if(head[id]==-1){
head[id]=val;
} else{
nxt[lst[id]]=val;
}
lst[id]=val;
nxt[val]=-1;
}
void build_sa(){
/// sort with length 1 before lifting
for(int i=1; i<=lenS; ++i) push(s[i],i);
cnts=cntr=0;
for(int i=0; i<128; ++i){
if(head[i]==-1) continue;
++cntr;
int &j=head[i];
while(j!=-1){
sa[++cnts]=j;
rnk[j]=cntr;
j=nxt[j];
}
}
/// start lifting length
for(int len=1; len<lenS; len<<=1){
for(int i=lenS-len+1; i<=lenS; ++i){
push(rnk[i],i);
rnk2[i]=0;
}
for(int i=1; i<=lenS; ++i){
if(sa[i]>len){
push(rnk[sa[i]-len], sa[i]-len);
rnk2[sa[i]-len]=rnk[sa[i]];
}
}
cnts=cntr=0;
for(int i=1; i<=lenS; ++i){
rnk2[sa[cnts]]=-1;
int &j=head[i];
while(j!=-1){
sa[++cnts]=j;
if(rnk2[sa[cnts-1]]!=rnk2[j]) ++cntr;
rnk[j]=cntr;
j=nxt[j];
}
}
}
}
void build_lcp(){
int k=0;
for(int i=1; i<=lenS; ++i){
if(k) --k;
if(rnk[i]==lenS) continue;
int x=sa[rnk[i]+1];
while(max(i,x)+k<=lenS && s[i+k]==s[x+k]) ++k;
lcp[rnk[i]]=k;
}
}
void init(const string &_s){
s=_s;
lenS=s.size(); s=" "+s; /// 1-indexed, can be switched
memset(head,-1,sizeof(head));
build_sa();
build_lcp();
for(int i=1; i<=lenS; ++i){
cout<<sa[i]-1<<" ";
}
cout<<'\n';
}
} sigma;
int main(){
// freopen("test.inp","r",stdin);
string s; cin>>s;
sigma.init(s);
}
Ly8vIFRlc3RlZCBDb2RlIGF0OiBodHRwczovL2ouLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm8uanAvc3VibWlzc2lvbi8zMTg4MzUKCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTj0xZTYrNTsKCnN0cnVjdCBTdWZmaXhBcnJheXsKICAgIGludCBsZW5TOyBzdHJpbmcgczsKCiAgICBpbnQgcm5rW05dLHNhW05dLGxjcFtOXTsKICAgIGludCBjbnRyLGNudHMscm5rMltOXTsKICAgIGludCBoZWFkW05dLGxzdFtOXSxueHRbTl07CgogICAgdm9pZCBwdXNoKGludCBpZCwgaW50IHZhbCl7CiAgICAgICAgaWYoaGVhZFtpZF09PS0xKXsKICAgICAgICAgICAgaGVhZFtpZF09dmFsOwogICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgbnh0W2xzdFtpZF1dPXZhbDsKICAgICAgICB9CgogICAgICAgIGxzdFtpZF09dmFsOwogICAgICAgIG54dFt2YWxdPS0xOwogICAgfQoKICAgIHZvaWQgYnVpbGRfc2EoKXsKICAgICAgICAvLy8gc29ydCB3aXRoIGxlbmd0aCAxIGJlZm9yZSBsaWZ0aW5nCiAgICAgICAgZm9yKGludCBpPTE7IGk8PWxlblM7ICsraSkgcHVzaChzW2ldLGkpOwogICAgICAgIGNudHM9Y250cj0wOwogICAgICAgIGZvcihpbnQgaT0wOyBpPDEyODsgKytpKXsKICAgICAgICAgICAgaWYoaGVhZFtpXT09LTEpIGNvbnRpbnVlOwogICAgICAgICAgICArK2NudHI7CgogICAgICAgICAgICBpbnQgJmo9aGVhZFtpXTsKICAgICAgICAgICAgd2hpbGUoaiE9LTEpewogICAgICAgICAgICAgICAgc2FbKytjbnRzXT1qOwogICAgICAgICAgICAgICAgcm5rW2pdPWNudHI7CiAgICAgICAgICAgICAgICBqPW54dFtqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8vIHN0YXJ0IGxpZnRpbmcgbGVuZ3RoCiAgICAgICAgZm9yKGludCBsZW49MTsgbGVuPGxlblM7IGxlbjw8PTEpewogICAgICAgICAgICBmb3IoaW50IGk9bGVuUy1sZW4rMTsgaTw9bGVuUzsgKytpKXsKICAgICAgICAgICAgICAgIHB1c2gocm5rW2ldLGkpOwogICAgICAgICAgICAgICAgcm5rMltpXT0wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcihpbnQgaT0xOyBpPD1sZW5TOyArK2kpewogICAgICAgICAgICAgICAgaWYoc2FbaV0+bGVuKXsKICAgICAgICAgICAgICAgICAgICBwdXNoKHJua1tzYVtpXS1sZW5dLCBzYVtpXS1sZW4pOwogICAgICAgICAgICAgICAgICAgIHJuazJbc2FbaV0tbGVuXT1ybmtbc2FbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNudHM9Y250cj0wOwogICAgICAgICAgICBmb3IoaW50IGk9MTsgaTw9bGVuUzsgKytpKXsKICAgICAgICAgICAgICAgIHJuazJbc2FbY250c11dPS0xOwoKICAgICAgICAgICAgICAgIGludCAmaj1oZWFkW2ldOwogICAgICAgICAgICAgICAgd2hpbGUoaiE9LTEpewogICAgICAgICAgICAgICAgICAgIHNhWysrY250c109ajsKICAgICAgICAgICAgICAgICAgICBpZihybmsyW3NhW2NudHMtMV1dIT1ybmsyW2pdKSArK2NudHI7CiAgICAgICAgICAgICAgICAgICAgcm5rW2pdPWNudHI7CiAgICAgICAgICAgICAgICAgICAgaj1ueHRbal07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdm9pZCBidWlsZF9sY3AoKXsKICAgICAgICBpbnQgaz0wOwogICAgICAgIGZvcihpbnQgaT0xOyBpPD1sZW5TOyArK2kpewogICAgICAgICAgICBpZihrKSAtLWs7CiAgICAgICAgICAgIGlmKHJua1tpXT09bGVuUykgY29udGludWU7CiAgICAgICAgICAgIGludCB4PXNhW3Jua1tpXSsxXTsKICAgICAgICAgICAgd2hpbGUobWF4KGkseCkrazw9bGVuUyAmJiBzW2kra109PXNbeCtrXSkgKytrOwogICAgICAgICAgICBsY3Bbcm5rW2ldXT1rOwogICAgICAgIH0KICAgIH0KCiAgICB2b2lkIGluaXQoY29uc3Qgc3RyaW5nICZfcyl7CiAgICAgICAgcz1fczsKICAgICAgICBsZW5TPXMuc2l6ZSgpOyBzPSIgIitzOyAvLy8gMS1pbmRleGVkLCBjYW4gYmUgc3dpdGNoZWQKCiAgICAgICAgbWVtc2V0KGhlYWQsLTEsc2l6ZW9mKGhlYWQpKTsKICAgICAgICBidWlsZF9zYSgpOwogICAgICAgIGJ1aWxkX2xjcCgpOwoKICAgICAgICBmb3IoaW50IGk9MTsgaTw9bGVuUzsgKytpKXsKICAgICAgICAgICAgY291dDw8c2FbaV0tMTw8IiAiOwogICAgICAgIH0KICAgICAgICBjb3V0PDwnXG4nOwogICAgfQp9IHNpZ21hOwoKaW50IG1haW4oKXsKLy8gICAgZnJlb3BlbigidGVzdC5pbnAiLCJyIixzdGRpbik7CiAgICBzdHJpbmcgczsgY2luPj5zOwogICAgc2lnbWEuaW5pdChzKTsKfQ==