Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <cstdio>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <queue>
- #include <stack>
- #include <deque>
- #include <set>
- #include <map>
- #include <climits>
- #include <cstdlib>
- #include<time.h>
- #include<iomanip>
- using namespace std;
- const int N = 6e5 + 7;
- int pNew[N][32],p[N],k,len,i,lol;
- string s;
- bool cmp(int i, int i1) {
- if (k == 0) {
- return s[i] < s[i1];
- }
- if (pNew[i][k-1] == pNew[i1][k-1]) {
- return pNew[i + (1 << (k-1))][k-1] < pNew[i1 + (1 << (k-1))][k-1];
- }
- return pNew[i][k-1] < pNew[i1][k-1];
- }
- void BuildSuffMass(string S) {
- S += "#";
- s = S + S;
- int h = 1, pwr = 0;
- while (h < s.length()) {
- h *= 2;
- pwr++;
- }
- h *= 2;
- pwr++;
- len = h;
- while (s.length() < h) {
- s += S[s.length() % S.length()];
- }
- //cout << s << "\n";
- k = 0;
- while (k < pwr-1){
- for (int i = 0; i <= len - (1 << k)+1; i++) {
- p[i] = i;
- }
- sort(p, p + (len - (1 << k)) + 1, cmp);
- for (i = 0; i <= len - (1 << k); i++) {
- if (i > 0) {
- if (k == 0) {
- if (s[p[i]] == s[p[i - 1]]) {
- pNew[p[i]][k] = pNew[p[i - 1]][k];
- }
- else {
- pNew[p[i]][k] = i+1;
- }
- }
- else {
- if (pNew[p[i]][k - 1] == pNew[p[i - 1]][k - 1] && pNew[p[i] + (1 << (k - 1))][k - 1] == pNew[p[i - 1] + (1 << (k - 1))][k - 1]) {
- pNew[p[i]][k] = pNew[p[i - 1]][k];
- }
- else {
- pNew[p[i]][k] = i+1;
- }
- }
- }
- else {
- pNew[p[i]][k] = i+1;
- }
- //cout << p[i] << " ";
- }
- k++;
- }
- k--;
- }
- vector<pair<int, int>> ans;
- int main() {
- std::ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- cin >> s;
- lol = s.size();
- BuildSuffMass(s);
- ans.reserve(lol+1);
- for (i = 0; i <= lol; i++) {
- ans.push_back({ pNew[i][k],i });
- }
- sort(ans.begin(), ans.end());
- for (i = 0; i <= lol; i++) {
- cout << ans[i].second << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement