Advertisement
hoanmalai

LONGCS

Apr 1st, 2022
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e5 + 100;
  4.  
  5. int n;
  6.  
  7. vector<int> sort_cyclic_shifts(string const& s) {
  8. int n = s.size();
  9. const int alphabet = 256;
  10. vector<int> p(n), c(n), cnt(max(alphabet, n), 0);
  11. for (int i = 0; i < n; i++)
  12. cnt[s[i]]++;
  13. for (int i = 1; i < alphabet; i++)
  14. cnt[i] += cnt[i-1];
  15. for (int i = 0; i < n; i++)
  16. p[--cnt[s[i]]] = i;
  17. c[p[0]] = 0;
  18. int classes = 1;
  19. for (int i = 1; i < n; i++) {
  20. if (s[p[i]] != s[p[i-1]])
  21. classes++;
  22. c[p[i]] = classes - 1;
  23. }
  24. vector<int> pn(n), cn(n);
  25. for (int h = 0; (1 << h) < n; ++h) {
  26. for (int i = 0; i < n; i++) {
  27. pn[i] = p[i] - (1 << h);
  28. if (pn[i] < 0)
  29. pn[i] += n;
  30. }
  31. fill(cnt.begin(), cnt.begin() + classes, 0);
  32. for (int i = 0; i < n; i++)
  33. cnt[c[pn[i]]]++;
  34. for (int i = 1; i < classes; i++)
  35. cnt[i] += cnt[i-1];
  36. for (int i = n-1; i >= 0; i--)
  37. p[--cnt[c[pn[i]]]] = pn[i];
  38. cn[p[0]] = 0;
  39. classes = 1;
  40. for (int i = 1; i < n; i++) {
  41. pair<int, int> cur = {c[p[i]], c[(p[i] + (1 << h)) % n]};
  42. pair<int, int> prev = {c[p[i-1]], c[(p[i-1] + (1 << h)) % n]};
  43. if (cur != prev)
  44. ++classes;
  45. cn[p[i]] = classes - 1;
  46. }
  47. c.swap(cn);
  48. }
  49. return p;
  50. }
  51.  
  52. vector<int> suffix_array_construction(string s) {
  53. s += "$";
  54. vector<int> sorted_shifts = sort_cyclic_shifts(s);
  55. sorted_shifts.erase(sorted_shifts.begin());
  56. return sorted_shifts;
  57. }
  58.  
  59.  
  60. vector<int> lcp_construction(string const& s, vector<int> const& p) {
  61. int n = s.size();
  62. vector<int> r(3*n, 0);
  63. for (int i = 0; i < n; i++)
  64. r[p[i]] = i;
  65. int k = 0;
  66. vector<int> lcp(n-1, 0);
  67. for (int i = 0; i < n; i++) {
  68. if (r[i] == n - 1) {
  69. k = 0;
  70. continue;
  71. }
  72. int j = p[r[i] + 1];
  73. while (i + k < n && j + k < n && s[i+k] == s[j+k])
  74. k++;
  75. lcp[r[i]] = k;
  76. if (k)
  77. k--;
  78. }
  79. return lcp;
  80. }
  81.  
  82. int m[N][24];
  83. int lg[N];
  84.  
  85. int getMin(int u, int v) {
  86. int k = lg[v - u + 1];
  87. return min(m[u][k], m[v - (1 << k) + 1][k]);
  88. }
  89.  
  90. void RMQ_process(vector <int> &a) {
  91. int n = a.size();
  92. for(int i = 2; i <= n; i++)
  93. lg[i] = lg[i / 2] + 1;
  94. for (int i = 0; i < n; i++) m[i][0] = a[i];
  95.  
  96. for (int k = 1; (1 << k) <= n; k++)
  97. for (int i = 0; i + (1 << k) - 1 < n; i++)
  98. m[i][k] = min(m[i][k - 1], m[i + (1 << (k - 1))][k - 1]);
  99. }
  100.  
  101.  
  102. int getAns(vector <int> &t) {
  103. int ans = 1e9+8;
  104. for (int i = 0; i < t.size(); i++) {
  105. if (t[i] == -1)
  106. return 0;
  107. }
  108. for (int i = 1; i < t.size(); i++) {
  109. int u = min(t[i-1], t[i]);
  110. int v = max(t[i-1], t[i]);
  111. ans = min(ans, getMin(u, v-1));
  112. }
  113. return ans;
  114. }
  115.  
  116. int main()
  117. {
  118. ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  119. int T;
  120. cin >> T;
  121. while (T--) {
  122. int k;
  123. cin >> k;
  124. string s = "";
  125. vector <int> t(k, 0);getchar();
  126. for (int i = 0; i < k; i++) {
  127. t[i] = s.size();
  128. string tmp = "";
  129. cin >> tmp;
  130. s += tmp;
  131. if (i != k-1) s += char(i);
  132. }
  133. vector <int> p = suffix_array_construction(s);
  134. vector <int> lcp = lcp_construction(s, p);
  135. RMQ_process(lcp);
  136. int res = 0;
  137. vector <int> id(k, -1);
  138. int cnt = 0;
  139. for (int x: p) {
  140. int i = upper_bound(t.begin(), t.end(), x) - t.begin() - 1;
  141. id[i] = cnt;
  142. res = max(res, getAns(id));
  143. cnt++;
  144. }
  145. if (k == 1) {
  146. res = s.size();
  147. }
  148. cout << res << endl;
  149. }
  150. }
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement