int C[maxn], T[maxn], T2[maxn], SA[maxn];
int build_sa(std::string S, int m) {
int n = S.length();
int *X=T, *Y=T2;
for (int i=0;i<n;++i) Y[i]=0;
for (int i=0;i<m;++i) C[i]=0;
for (int i=0;i<n;++i) C[X[i]=S[i]]++;
for (int i =1;i<m;++i) C[i]+=C[i-1];
for (int i=n-1;i>=0;i--) SA[--C[X[i]]]=i;
// printf("SA:"); for (int i = 0;i<n;++i) printf("%d ", SA[i]); printf("\n");
for (int k=1;k<=n;k<<=1) {
int p=0;
//for (int i=0;i<n;++i) Y[i]=0;
for (int i=n-k;i<n;++i) Y[p++]=i;
for (int i=0;i<n;++i) if (SA[i]>=k) Y[p++]=SA[i]-k;
for (int i=0;i<m;++i) C[i]=0;
for (int i=0;i<n;++i) C[X[Y[i]]]++;
for (int i=1;i<m;++i) C[i]+=C[i-1];
for (int i=n-1;i>=0;i--) SA[--C[X[Y[i]]]]=Y[i];
p=1; std::swap(X, Y); X[SA[0]]=0;
for (int i=0;i<n;++i) X[SA[i]]=Y[SA[i-1]]==Y[SA[i]]&&Y[SA[i-1]+k]==Y[SA[i]+k]?p-1:p++;
if (p>=n) break;
m=p;
//printf("SA:"); for (int i = 0;i<n;++i) printf("%d ", SA[i]); printf("\n");
}
}
int main() {
std::string s;
std::cin >> s;
build_sa(s, 300); int n=s.length();
for (int i =0;i<n;++i) printf("%d ", SA[i]+1);
return 0;
}