Advertisement
bibaboba12345

TL34)))

Jul 31st, 2021
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <string>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <deque>
  11. #include <set>
  12. #include <map>
  13. #include <climits>
  14. #include <cstdlib>
  15. #include<time.h>
  16. #include<iomanip>
  17. using namespace std;
  18. const int N = 6e5 + 7;
  19. int pNew[N][32],p[N],k,len,i,lol;
  20. string s;
  21. bool cmp(int i, int i1) {
  22. if (k == 0) {
  23. return s[i] < s[i1];
  24. }
  25.  
  26. if (pNew[i][k-1] == pNew[i1][k-1]) {
  27. return pNew[i + (1 << (k-1))][k-1] < pNew[i1 + (1 << (k-1))][k-1];
  28. }
  29. return pNew[i][k-1] < pNew[i1][k-1];
  30. }
  31. void BuildSuffMass(string S) {
  32. S += "#";
  33. s = S + S;
  34. int h = 1, pwr = 0;
  35. while (h < s.length()) {
  36. h *= 2;
  37. pwr++;
  38. }
  39. h *= 2;
  40. pwr++;
  41. len = h;
  42. while (s.length() < h) {
  43. s += S[s.length() % S.length()];
  44. }
  45. //cout << s << "\n";
  46. k = 0;
  47. while (k < pwr-1){
  48. for (int i = 0; i <= len - (1 << k)+1; i++) {
  49. p[i] = i;
  50. }
  51. sort(p, p + (len - (1 << k)) + 1, cmp);
  52. for (i = 0; i <= len - (1 << k); i++) {
  53. if (i > 0) {
  54. if (k == 0) {
  55. if (s[p[i]] == s[p[i - 1]]) {
  56. pNew[p[i]][k] = pNew[p[i - 1]][k];
  57. }
  58. else {
  59. pNew[p[i]][k] = i+1;
  60. }
  61. }
  62. else {
  63. 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]) {
  64. pNew[p[i]][k] = pNew[p[i - 1]][k];
  65. }
  66. else {
  67. pNew[p[i]][k] = i+1;
  68. }
  69. }
  70. }
  71. else {
  72. pNew[p[i]][k] = i+1;
  73. }
  74. //cout << p[i] << " ";
  75. }
  76. k++;
  77. }
  78. k--;
  79. }
  80. vector<pair<int, int>> ans;
  81. int main() {
  82. std::ios::sync_with_stdio(false);
  83. cin.tie(0);
  84. cout.tie(0);
  85. cin >> s;
  86. lol = s.size();
  87. BuildSuffMass(s);
  88. ans.reserve(lol+1);
  89. for (i = 0; i <= lol; i++) {
  90. ans.push_back({ pNew[i][k],i });
  91. }
  92. sort(ans.begin(), ans.end());
  93. for (i = 0; i <= lol; i++) {
  94. cout << ans[i].second << " ";
  95. }
  96.  
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement