Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vector<int> suf (string s) {
- s += '#';
- int n = sz (s);
- vector<int> p (n), c (n);
- vector<pair<char, int>> a (n);
- fr (i, n) a[i] = {s[i], i};
- sort (all (a));
- fr (i, n) p[i] = a[i].se;
- c[p[0]] = 0;
- fl (i, 1, n) {
- if (a[i].fi == a[i - 1].fi) c[p[i]] = c[p[i - 1]];
- else c[p[i]] = c[p[i - 1]] + 1;
- }
- int k = 0;
- while ((1<<k) < n) {
- vector<pair<pii, int>> _a (n);
- fr (i, n) _a[i] = {{c[i], c[(i + (1<<k)) % n]}, i};
- sort (all (_a));
- fr (i, n) p[i] = _a[i].se;
- c[p[0]] = 0;
- fl (i, 1, n) {
- if (_a[i].fi == _a[i - 1].fi) c[p[i]] = c[p[i - 1]];
- else c[p[i]] = c[p[i - 1]] + 1;
- }
- ++k;
- }
- for (auto& x: p) cout << x << ' ';
- return vector<int> (p.begin () + 1, p.end ());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement