Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.55 KB | None | 0 0
  1. #include <bits\stdc++.h>
  2.  
  3. #ifdef LOCAL
  4. #define dbg(x) cerr << #x << " = " << (x) << endl;
  5. #else
  6. #define dbg(x)
  7. #endif
  8. #define int long long
  9. #define endl "\n"
  10. #define x first
  11. #define y second
  12. #define len(x) ((int)(x).size())
  13.  
  14. using namespace std;
  15.  
  16. void solve(); signed main() {
  17. #ifdef LOCAL
  18. freopen("input.txt", "r", stdin);
  19. freopen("output.txt", "w", stdout);
  20. #else
  21. // freopen("loganqueries.in", "r", stdin);
  22. // freopen("loganqueries.out", "w", stdout);
  23. #endif
  24. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  25. cout.setf(ios::fixed); cout.precision(15);
  26. solve();
  27. }
  28.  
  29. const int INF = 1e18, MAXN = 3e5 + 10, MOD = 1e9 + 7;
  30. vector<int> lcp;
  31. vector<int> p, c;
  32.  
  33. vector<int> calc_lcp(vector<int> &val, vector<int> &c, vector<int> &p) {
  34. int n = len(val);
  35. int current_lcp = 0;
  36. vector<int> lcp(n);
  37. for (int i = 0; i < n; i++) {
  38. if (c[i] == n - 1)
  39. continue;
  40. int nxt = p[c[i] + 1];
  41. while (max(i, nxt) + current_lcp < n && val[i + current_lcp] == val[nxt + current_lcp])
  42. current_lcp++;
  43. lcp[c[i]] = current_lcp;
  44. current_lcp = max(0ll, current_lcp - 1);
  45. }
  46. return lcp;
  47. }
  48.  
  49. vector<int> suffix_array(vector<int> &s) {
  50. s.push_back(0);
  51. int n = len(s),cnt = 0, cls = 0;
  52. c.resize(n), p.resize(n);
  53.  
  54. map<int, vector<int>> t;
  55. for (int i = 0; i < n; i++)
  56. t[s[i]].push_back(i);
  57.  
  58. for (auto &x : t) {
  59. for (int u : x.y)
  60. c[u] = cls, p[cnt++] = u;
  61. cls++;
  62. }
  63.  
  64. for (int l = 1; cls < n; l++) {
  65. vector<vector<int>> a(cls);
  66. vector<int> _c(n);
  67. int d = (1 << l) / 2;
  68. int _cls = cnt = 0;
  69.  
  70. for (int i = 0; i < n; i++) {
  71. int k = (p[i] - d + n) % n;
  72. a[c[k]].push_back(k);
  73. }
  74.  
  75. for (int i = 0; i < cls; i++) {
  76. for (int j = 0; j < len(a[i]); j++) {
  77. if (j == 0 || c[(a[i][j] + d) % n] != c[(a[i][j - 1] + d) % n])
  78. _cls++;
  79. _c[a[i][j]] = _cls - 1;
  80. p[cnt++] = a[i][j];
  81. }
  82. }
  83.  
  84. c = _c;
  85. cls = _cls;
  86. }
  87.  
  88. lcp = calc_lcp(s, c, p);
  89. return vector<int>(p.begin() + 1, p.end());
  90. }
  91.  
  92. void solve() {
  93. int n, m;
  94. cin >> n >> m;
  95. vector<int> a(n);
  96. for (int i = 0; i < n; ++i) {
  97. cin >> a[i];
  98. }
  99.  
  100. vector<int> sm = suffix_array(a);
  101. lcp[0] = -1, lcp[n] = -1;
  102.  
  103. vector<int> ind1, ind2;
  104. vector<int> bl(n, -1), br(n, -1);
  105. for (int i = 0; i < n + 1; ++i) {
  106. while (ind1.size() > 0 && lcp[ind1.back()] > lcp[i]) {
  107. br[ind1.back()] = i;
  108. ind1.pop_back();
  109. }
  110. ind1.push_back(i);
  111. while (ind2.size() > 0 && lcp[ind2.back()] > lcp[n - i - 1]) {
  112. bl[ind2.back()] = n - i - 1;
  113. ind2.pop_back();
  114. }
  115. ind2.push_back(n - i - 1);
  116. }
  117.  
  118. int ans = n, id = 0, ll = n;
  119. for (int i = 1; i < n; ++i) {
  120. int k = lcp[i];
  121. int l = bl[i], r = br[i];
  122.  
  123. if (bl[i] == -1) {
  124. l = i;
  125. }
  126. if (br[i] == -1) {
  127. r = i;
  128. }
  129. l++;
  130.  
  131. if (r >= l && ans <= (r - l + 1) * k) {
  132. ans = (r - l + 1) * k;
  133. id = n - p[l] - 1;
  134. ll = (r - l + 1);
  135. }
  136. }
  137.  
  138. cout << ans << endl;
  139. cout << ll << endl;
  140. for (int i = id; i < ll + id; ++i) {
  141. cout << a[i] << " ";
  142. }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement