#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
using namespace std;
ll input(){
ll ans=0;
char c=getchar();
bool flag=0;
while(c<'0'||c>'9'){
if(c=='-')flag=1;
c=getchar();
}
while(c>='0'&&c<='9'){
ans=ans*10+c-'0';
c=getchar();
}
if(flag)ans=-ans;
return ans;
}
void print(ll ans,char c=0,bool flag=1){
if(ans<0){
putchar('-');
ans=-ans;
}
if(ans>=10)print(ans/10,c,0);
putchar('0'+ans%10);
if(flag&&c!=0)putchar(c);
}
struct aaa{
ll id;
ll first,second;
}op[maxn];
bool cmp(aaa a,aaa b){
if(a.first<b.first)return 1;
if(a.first>b.first)return 0;
return (a.second<b.second);
}
string s;
ll sa[maxn],rk[maxn],height[maxn];
void printRk(){
cout<<"Rank:"<<endl;
for(ll i=0;i<s.size();i++)
print(rk[i],' ');
putchar('\n');
}
ll Power(ll d,ll z){
if(z==0)return 1;
ll ans=1,k=Power(d,(z>>1));
if(z&1)ans=k*k*d;
else ans=k*k;
return ans;
}
ll check(ll x,ll i){
x/=Power(10,i);
return x%10;
}
void Sort(){
queue< aaa >s1;
aaa a[11][1000000];
ll cnt[11]={0};
for(ll i=0;i<s.size();i++){
s1.push(op[i]);
}
for(ll i=0;i<=5;i++){
for(ll j=0;j<s.size();j++){
aaa now=s1.front();
s1.pop();
if(now.second>=0){
ll kk=check(now.second,i);
a[kk][cnt[kk]++]=now;
}
else a[10][cnt[10]++]=now;
}
for(ll k=10;1;k++){
for(ll o=0;o<cnt[k];o++){
s1.push(a[k][o]);
}
cnt[k]=0;
if(k==10)k=-1;
if(k==9)break;
}
}
for(ll i=0;i<=5;i++){
for(ll j=0;j<s.size();j++){
aaa now=s1.front();
s1.pop();
ll kk=check(now.first,i);
a[kk][cnt[kk]++]=now;
}
for(ll k=0;k<=9;k++){
for(ll o=0;o<cnt[k];o++){
s1.push(a[k][o]);
}
cnt[k]=0;
}
}
for(ll j=0;j<s.size();j++){
op[j]=s1.front();
s1.pop();
}
}
int main(){
cin>>s;
for(ll i=0;i<s.size();i++){
op[i].id=i;
op[i].first=op[i].second=(ll)(s[i]);
}
// sort(op,op+s.size(),cmp);
Sort();
for(ll i=0,j=0;i<s.size();i++){
if(i!=0&&op[i].first!=op[i-1].first)j++;
rk[op[i].id]=j;
}
for(ll i=1;i<s.size();i=(i<<1)){
for(ll j=0;j<s.size();j++){
op[j].id=j;
op[j].first=rk[j];
if(j+i<s.size())op[j].second=rk[j+i];
else op[j].second=-1;
}
Sort();
for(ll i=0,j=0;i<s.size();i++){
if(i!=0&&(op[i].first!=op[i-1].first||op[i].second!=op[i-1].second))j++;
rk[op[i].id]=j;
}
}
for(ll i=0;i<s.size();i++){
sa[rk[i]]=i;
}
for(ll i=0;i<s.size();i++)print(sa[i]+1,' ');
return 0;
}
巨佬们帮忙看下基数排序写得有问题没有,谢谢啦