Advertisement
Guest User

K

a guest
Mar 31st, 2020
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <unordered_map>
  5. #include <algorithm>
  6. #include <string>
  7. #include <unordered_set>
  8. #include <list>
  9. #include <map>
  10. #include <queue>
  11.  
  12. #define mp make_pair
  13. #define i64 long long;
  14. #define ui64 unsigned long long;
  15. using namespace std;
  16.  
  17. string s;
  18. int n;
  19.  
  20. vector<int> c;
  21. vector<int> v;
  22.  
  23. bool cmp(int a, int b) {
  24. return s[a] < s[b];
  25. }
  26.  
  27. int length = 1;
  28. bool cmp1(int a, int b) {
  29. if (c[a] != c[b]) {
  30. return c[a] < c[b];
  31. }
  32. return c[(a + length) % n] < c[(b + length) % n];
  33. }
  34.  
  35. int main() {
  36. #ifdef _KOCH
  37. freopen("input.txt", "r", stdin);
  38. #else
  39. //freopen("common.in", "r", stdin);
  40. //freopen("common.out", "w", stdout);
  41. #endif
  42. cin >> s;
  43. int a1 = s.size();
  44. s += '$';
  45. v.resize(s.size());
  46. c.resize(s.size());
  47. n = s.size();
  48. for (int i = 0; i < v.size(); ++i) {
  49. v[i] = i;
  50. }
  51. stable_sort(v.begin(), v.end(), cmp);
  52. int kek = 0;
  53. c[v[0]] = 0;
  54. for (int i = 1; i < v.size(); ++i) {
  55. if (s[v[i]] == s[v[i - 1]]) {
  56. c[v[i]] = kek;
  57. }
  58. else {
  59. kek++;
  60. c[v[i]] = kek;
  61. }
  62. }
  63.  
  64.  
  65. for (; length <= v.size(); length *= 2) {
  66. stable_sort(v.begin(), v.end(), cmp1);
  67. kek = 0;
  68. vector<int> tmp(n);
  69. tmp[v[0]] = 0;
  70. for (int i = 1; i < v.size(); ++i) {
  71. if (cmp1(v[i], v[i - 1]) == cmp1(v[i - 1], v[i])) {
  72. tmp[v[i]] = kek;
  73. }
  74. else {
  75. kek++;
  76. tmp[v[i]] = kek;
  77. }
  78. }
  79. swap(c, tmp);
  80. }
  81.  
  82.  
  83. std::vector<int> rev(n);
  84. vector<int> lcp(n);
  85. for (int i = 0; i < n; ++i) {
  86. rev[v[i]] = i;
  87. }
  88.  
  89. for (int i = 0, k = 0; i < n; ++i)
  90. {
  91. if (k > 0) {
  92. k--;
  93. }
  94. if (rev[i] == n - 1)
  95. {
  96. k = 0;
  97. continue;
  98. }
  99.  
  100. int j = v[rev[i] + 1];
  101. while (max(i + k, j + k) < n && s[i + k] == s[j + k]) {
  102. k++;
  103. }
  104.  
  105. lcp[rev[i]] = k;
  106. }
  107.  
  108. lcp.insert(lcp.begin(), 0);
  109.  
  110. int res = 0;
  111. int x = 0;
  112.  
  113. for (int i = 1; i < n; ++i) {
  114. if (((v[i] < a1 && v[i - 1] > a1) || (v[i] > a1 && v[i - 1] < a1)) && res < lcp[i]) {
  115. res = lcp[i];
  116. x = v[i];
  117. }
  118. }
  119.  
  120. int64_t sum1 = 0;
  121. int64_t sum2 = 0;
  122.  
  123. for (auto elem : v) {
  124. sum1 += n - elem - 1;
  125. }
  126.  
  127. for (int i = 1; i < n; ++i) {
  128. sum2 += lcp[i];
  129. }
  130.  
  131. cout << sum1 - sum2 << endl;
  132.  
  133. return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement