#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<limits.h>usingnamespace std;typedefunsignedlonglong ULL;constint N =3e5+10;constint P =131;int n;char s[N];
ULL h[N], p[N];int sa[N];//计算字串的hash值
ULL get(int l,int r){
return h[r]- h[l -1]* p[r - l +1];}//二分找两个后缀串的最长公共前缀intget_max_common_prefix(int a,int b){
int l =0;int r =min(n - a +1, n - b +1);while(l < r){
int mid =(l + r +1)>>1;if(get(a, a + mid -1)!=get(b, b + mid -1)){
r = mid -1;}else{
l = mid;}}return l;}//比较两个后缀串的字典序boolcmp(int a,int b){
int len =get_max_common_prefix(a, b);int va = a + len > n ? INT_MIN : s[a + len];int vb = b + len > n ? INT_MIN : s[b + len];return va < vb;}intmain(){
scanf("%s", s +1);
n =strlen(s +1);
p[0]=1;for(int i =1; i <= n; i++){
h[i]= h[i -1]* P + s[i];
p[i]= p[i -1]* P;
sa[i]= i;}sort(sa +1, sa +1+ n, cmp);for(int i =1; i <= n; i++)printf("%d ", sa[i]-1);
cout << endl;for(int i =1; i <= n; i++){
if(i ==1){
printf("%d ",0);}else{
printf("%d ",get_max_common_prefix(sa[i -1], sa[i]));}}return0;}