#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>usingnamespace std;typedefunsignedlonglong ull;constint base =131;constint N =3e5+10;char str[N];
ull h[N], p[N];int sa[N], n;
ull gethash(int l,int r){//得到某一段的hash值return h[r]- h[l -1]* p[r - l +1];}intsumsub(int a,int b){int l =0, r =min(n - a +1, n - b +1);//取最小的。while(l < r){//二分。int mid =(l + r +1)>>1;if(gethash(a, a + mid -1)!=gethash(b, b + mid -1)) r = mid -1;else l = mid;}return r;}boolcmp(int a,int b){int l =sumsub(a, b);//兩個的相同前綴長度。int x = a + l > n ?-1e9: str[a + l];如果有一個單詞都是前綴,防止發生數組越界。int y = b + l > n ?-1e9: str[b + l];return x < y;}intmain(){scanf("%s", str +1);//從第一個字符開始可以避免hash的邊界問題。n =strlen(str +1);p[0]=1;for(int i =1; i <= n; i++){h[i]= h[i -1]* base + str[i]-'a'+1;p[i]= p[i -1]* base;sa[i]= i;}sort(sa +1, sa + n +1, cmp);//對下標進行排序。for(int i =1; i <= n; i++)printf("%d%c", sa[i]-1, i == n ?'\n':' ');printf("0 ");for(int i =2; i <= n; i++)printf("%d%c",sumsub(sa[i], sa[i -1]), i == n ?'\n':' ');return0;}