int m = 128, i; for (i = 1; i <= n; i++) cnt[rk[i] = a[i]]++; for (i = 1; i <= m; i++) cnt[i] += cnt[i - 1]; for (i = n; i >= 1; i--) sa[cnt[rk[i]]--] = i; int p = 1; for (int len = 1; p < n; len *= 2, m = p) { p = 1; for (i = n - len + 1; i <= n; i++) id[p++] = i; for (i = 1; i <= n; i++) if (sa[i] > len) id[p++] = sa[i] - len; for (i = 0; i <= m; i++) cnt[i] = 0; for (i = 1; i <= n; i++) cnt[rk[i]]++; for (i = 1; i <= m; i++) cnt[i] += cnt[i - 1]; for (i = n; i >= 1; i--) sa[cnt[rk[id[i]]]--] = id[i]; for (i = 0; i <= n; i++) rk0[i] = rk[i]; p = 0; for (i = 1; i <= n; i++) { if (rk0[sa[i]] == rk0[sa[i - 1]] && rk0[sa[i] + len] == rk0[sa[i - 1] + len]) rk[sa[i]] = p; else rk[sa[i]] = ++p; } }
for (int i = 1, k = 0; i <= n; i++) { if (k) k--; while (a[i+k] == a[sa[rk[i]-1]+k]) k++; h[rk[i]] = k; }
for (int i = 1; i <= n; i++) cout << sa[i] << ' '; cout << endl; for (int i = 1; i <= n; i++) cout << h[i] << ' '; return0; }