Advertisement
newb_ie

longest common sub string(suffix array)

Dec 17th, 2020
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.81 KB | None | 0 0
  1. /*
  2. ======================
  3. [     ___T_          ]
  4. [    | 6=6 | =>HI :-)]
  5. [    |__o__|         ]
  6. [ >===]__o[===<      ]
  7. [     [o__]          ]
  8. [      .".           ]
  9. [      |_|           ]
  10. [                    ]
  11. ======================
  12. */
  13.  
  14. #include <bits/stdc++.h>
  15. using namespace std;
  16.  
  17. vector<int> sort_cyclic_shifts (string const& s) {
  18.     int n = (int) s.size();
  19.     const int alphabet = 256;
  20.     vector<int> p(n),c(n),cnt(max(alphabet,n),0);
  21.     for (int i = 0; i < n; ++i) ++cnt[s[i]];
  22.     for (int i = 1; i < alphabet; ++i) cnt[i] += cnt[i - 1];
  23.     for (int i = 0; i < n; ++i) p[--cnt[s[i]]] = i;
  24.     c[p[0]] = 0;
  25.     int classes = 1;
  26.     for (int i = 1; i < n; ++i) {
  27.         if (s[p[i]] != s[p[i - 1]]) ++ classes;
  28.         c[p[i]] = classes - 1;
  29.     }
  30.     vector<int> pn(n),cn(n);
  31.     for (int k = 0; (1 << k) < n; ++k) {
  32.         for (int i = 0; i < n; ++i) {
  33.             pn[i] = p[i] - (1 << k);
  34.             if (pn[i] < 0) {
  35.                 pn[i] += n;
  36.             }
  37.         }
  38.         fill(cnt.begin(),cnt.begin() + classes,0);
  39.         for (int i = 0; i < n; ++i) ++cnt[c[pn[i]]];
  40.         for (int i = 1; i < classes; ++i) cnt[i] += cnt[i - 1];
  41.         for (int i = n - 1; i >= 0; --i) p[--cnt[c[pn[i]]]] = pn[i];
  42.         cn[p[0]] = 0;
  43.         classes = 1;
  44.         for (int i = 1; i < n; ++i) {
  45.             pair<int,int> cur = make_pair(c[p[i]],c[(p[i] + (1 << k)) % n]);
  46.             pair<int,int> prev = make_pair(c[p[i - 1]],c[(p[i - 1] + (1 << k)) % n]);
  47.             if (cur != prev) ++classes;
  48.             cn[p[i]] = classes - 1;
  49.         }
  50.         c.swap(cn);
  51.     }
  52.     return p;
  53. }
  54.  
  55. vector<int> lcp_construction (string const& s,vector<int> const& p) {
  56.     int n = (int) s.size();
  57.     vector<int> rank(n,0);
  58.     for (int i = 0; i < n; ++i) rank[p[i]] = i;
  59.     int k = 0;
  60.     vector<int> lcp(n - 1,0);
  61.     for (int i = 0; i < n; ++i) {
  62.         if (rank[i] == n - 1) {
  63.             k = 0;
  64.             continue;
  65.         }
  66.         int j = p[rank[i] + 1];
  67.         while (i + k < n and j + k < n and s[i + k] == s[j + k]) ++k;
  68.         lcp[rank[i]] = k;
  69.         if (k) --k;
  70.     }
  71.     return lcp;
  72. }
  73.  
  74. vector<int> suffix_array_construction (string s) {
  75.     vector<int> sorted_shifts = sort_cyclic_shifts(s);
  76.     sorted_shifts.erase(sorted_shifts.begin());
  77.     return sorted_shifts;
  78. }
  79.  
  80. int main () {
  81.      ios::sync_with_stdio(false);
  82.      cin.tie(nullptr);
  83.      cout.tie(nullptr);
  84.      int T = 1;
  85.      //~ cin >> T;
  86.      for (int test_case = 1; test_case <= T; ++test_case) {
  87.          string s,t;
  88.          cin >> s >> t;
  89.          int n = (int) s.size();
  90.          s += '#' + t + '$';
  91.          vector<int> p = suffix_array_construction(s);
  92.          vector<int> lcp = lcp_construction(s,p);
  93.          int max_length = 0;
  94.          string res = "";
  95.          for (int i = 1; i < (int) s.size(); ++i) {
  96.              if ((p[i] < n and p[i - 1] > n) or (p[i] > n and p[i - 1] < n)) {
  97.                  max_length = max(max_length,lcp[i - 1]);
  98.                  if ((int) res.size() < max_length) {
  99.                      res = s.substr(p[i - 1],max_length);
  100.                  }
  101.              }
  102.          }
  103.          cout << res << "\n";
  104.      }
  105.      //cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement