1 #include<bits/stdc++.h> 2 using namespace std; 3 #define rep(i, a, b) for (register int i = a; i <= b; i++) 4 const int maxn = 1010; 5 int n; 6 char s[maxn]; 7 int sa[maxn], rk[maxn], height[maxn]; 8 int p[maxn], cnt[maxn], tmp[maxn]; 9 void solve() 10 { 11 rep(i, 1, n) 12 { 13 rk[i] = s[i]; 14 sa[i] = i; 15 } 16 for (int l = 0, pos = 0, sig = 255; pos < n; l = l ? l << 1 : 1, sig = pos) 17 { 18 pos = 0; 19 rep(i, n - l + 1, n) p[++pos] = i; 20 rep(i, 1, n) if (sa[i] > l) 21 p[++pos] = sa[i] - l; 22 23 memset(cnt, 0, sizeof(cnt)); 24 rep(i, 1, n) cnt[rk[i]]++; 25 rep(i, 1, sig) cnt[i] += cnt[i - 1]; 26 for (int i = n; i; i--) 27 sa[cnt[rk[p[i]]]--] = p[i]; 28 29 pos = 0; 30 rep(i, 1, n) tmp[sa[i]] = rk[sa[i]] == rk[sa[i - 1]] && rk[sa[i] + l] == rk[sa[i - 1] + l] ? pos : ++pos; 31 rep(i, 1, n) rk[i] = tmp[i]; 32 } 33 34 int j, k = 0; 35 rep(i, 1, n) 36 { 37 if (k) 38 k--; 39 j = sa[rk[i] - 1]; 40 while (s[i + k] == s[j + k]) 41 k++; 42 height[rk[i]] = k; 43 } 44 } 45 int main() 46 { 47 s[0] = 1; 48 cin >> s + 1; 49 n = strlen(s) - 1; 50 solve(); 51 for (int i = 1; i <= n; i++) 52 cout << sa[i] << " "; 53 cout << endl; 54 for (int i = 1; i <= n; i++) 55 cout << rk[i] << " "; 56 cout << endl; 57 for (int i = 1; i <= n; i++) 58 cout << height[i] << " "; 59 }