#define endl '\n' #define int long long #define IOS \ ios_base::sync_with_stdio(false); \ cin.tie(0); \ cout.tie(0) #define rep(i, a, n) for (int i = a; i <= n; i++) #define per(i, a, n) for (int i = n; i >= a; i--) #define all(x) (x).begin(), (x).end() typedefunsignedlonglong ull; typedeflonglong ll; typedef pair<int, int> pii;
structSA { vector<int> rk, sa, cnt, lcp, oldrk, px, id;
boolcmp(int x, int y, int w) { return oldrk[x] == oldrk[y] && oldrk[x + w] == oldrk[y + w]; }
SA(string& s) { int n = s.length(), m = 300; oldrk.resize(max(m + 1, 2 * n + 1)); sa.resize(max(m + 1, n + 1)); rk.resize(max(m + 1, n + 1)); cnt.resize(max(m + 1, n + 1)); lcp.resize(max(m + 1, n + 1)); px.resize(max(m + 1, n + 1)); id.resize(max(m + 1, n + 1)); s = " " + s; for (int i = 1; i <= n; ++i) ++cnt[rk[i] = s[i]]; for (int i = 1; i <= m; ++i) cnt[i] += cnt[i - 1]; for (int i = n; i >= 1; --i) sa[cnt[rk[i]]--] = i; for (int w = 1, p;; w <<= 1, m = p) { p = 0; for (int i = n; i > n - w; --i) id[++p] = i; for (int i = 1; i <= n; ++i) if (sa[i] > w) id[++p] = sa[i] - w; fill(cnt.begin(), cnt.end(), 0); for (int i = 1; i <= n; ++i) ++cnt[px[i] = rk[id[i]]]; for (int i = 1; i <= m; ++i) cnt[i] += cnt[i - 1]; for (int i = n; i >= 1; --i) sa[cnt[px[i]]--] = id[i]; copy(rk.begin(), rk.end(), oldrk.begin()); p = 0; for (int i = 1; i <= n; ++i) rk[sa[i]] = cmp(sa[i], sa[i - 1], w) ? p : ++p; if (p == n) { for (int i = 1; i <= n; ++i) sa[rk[i]] = i; break; } } for (int i = 1, k = 0; i <= n; ++i) { if (rk[i] == 0) continue; if (k) --k; while (s[i + k] == s[sa[rk[i] - 1] + k]) ++k; lcp[rk[i]] = k; } } };
voidsolve() { string s; cin >> s; int len = s.size(); SA sa(s); for (int i = 1; i <= len; i++) cout << sa.sa[i] << ' '; cout << endl; for (int i = 1; i <= len; i++) cout << sa.lcp[i] << ' '; cout << endl; }
signedmain() { IOS; int t = 1; cin >> t; while (t--) solve(); return0; }
while (cin >> s) { deb(s); n = s.size(); SA sa(s); auto q = sa.lc; SparseTable<int> qmn(q, [](int i, int j) { return min(i, j); }); cin >> m; int lstl, lstr; int sum = 0; int ans = 2 * m; deb(s); for (int i = 1; i <= m; i++) { int l2, r2; cin >> l2 >> r2; l2++; sum += 1 + r2 - l2 + 1; if (i == 1) { int res = 0; deb(i, res); // deb(s.substr(l2, max(0LL, r2 - l2 + 1 - res))); ans += (r2 - l2 + 1) + cal(res); lstl = l2, lstr = r2; continue; } int res = min(r2 - l2 + 1, lstr - lstl + 1); int pos1 = sa.rk[l2], pos2 = sa.rk[lstl]; if (pos1 != pos2) { res = min(res, qmn.get(min(pos1, pos2) + 1, max(pos1, pos2))); }