#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> usingnamespace std; #define MAXN 1000006 #define C 130 char ch[MAXN]; int sa[MAXN] , tp[MAXN] , rnk[MAXN] , buc[MAXN] , len; voidinit( ){ len = strlen( ch + 1 ); int m = C; for( int i = 1 ; i <= len ; ++ i ) ++ buc[rnk[i] = ch[i]]; for( int i = 1 ; i <= m ; ++ i ) buc[i] += buc[i-1]; for( int i = len ; i >= 1 ; -- i ) sa[buc[rnk[i]] --] = i; for( int k = 1 , p = 0 ; p < len ; k <<= 1 ) { p = 0; for( int i = 0 ; i <= m ; ++ i ) buc[i] = 0; for( int i = len - k + 1 ; i <= len ; ++ i ) tp[++p] = i; for( int i = 1 ; i <= len ; ++ i ) if( sa[i] > k ) tp[++p] = sa[i] - k; for( int i = 1 ; i <= len ; ++ i ) ++ buc[rnk[i]]; for( int i = 1 ; i <= m ; ++ i ) buc[i] += buc[ i-1 ]; for( int i = len ; i >= 1 ; -- i ) sa[buc[rnk[tp[i]]] --] = tp[i]; p = 1; swap( rnk , tp ); rnk[sa[1]] = 1; for( int i = 2 ; i <= len ; ++ i ) rnk[sa[i]] = ( tp[sa[i]] == tp[sa[i-1]] && tp[sa[i] + k] == tp[sa[i-1] + k] ) ? p : ++ p; m = p; } }
intmain(){ scanf("%s",ch+1); init(); for( int i = 1 ; i <= len ; ++ i ) printf("%d ",sa[i]); }