Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- #define long ll
- #define all(x) begin(x), end(x)
- const int N = 1e6 + 10;
- vector<int> bucket[N];
- int equiv[N];
- int new_e[N];
- int s_arr[N];
- int ptr = 0;
- int main() {
- #ifdef LC
- assert(freopen("input.txt", "r", stdin));
- assert(freopen("output.txt", "w", stdout));
- #endif
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- string s;
- s.reserve((int)1e6);
- cin >> s;
- s += '#';
- int n = (int)s.size();
- for (int i = 0; i < n; ++i) {
- equiv[i] = s[i];
- bucket[equiv[i]].push_back(i);
- }
- for (int i = 0; i < 256; ++i) {
- for (int suf : bucket[i]) {
- s_arr[ptr++] = suf;
- }
- bucket[i].clear();
- }
- for (int l = 1; l < n; l *= 2) {
- int max_class = 0;
- for (int ind = 0; ind < n; ++ind) {
- int suf = s_arr[ind] - l;
- if (suf < 0) {
- suf += n;
- }
- max_class = max(max_class, equiv[suf]);
- bucket[equiv[suf]].push_back(suf);
- }
- ptr = 0;
- for (int i = 0; i <= max_class; ++i) {
- for (int suf : bucket[i]) {
- s_arr[ptr++] = suf;
- }
- bucket[i].clear();
- }
- new_e[s_arr[0]] = 0;
- for (int i = 1; i < n; ++i) {
- int x = s_arr[i], y = s_arr[i - 1];
- int z = x + l, t = y + l;
- if (z >= n) {
- z -= n;
- }
- if (t >= n) {
- t -= n;
- }
- new_e[x] = new_e[y];
- if (equiv[x] > equiv[y] || equiv[z] > equiv[t]) {
- ++new_e[x];
- }
- }
- copy_n(new_e, n, equiv);
- }
- for (int i = 1; i < n; ++i) {
- cout << s_arr[i] << '\n';
- }
- cerr << "Time = " << clock() * 1000 / CLOCKS_PER_SEC << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement