Alex_tz307

Longest Common Substring Suffix Array

Sep 12th, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. void CountingSort (vector < int > &P, vector < int > C) {
  6.   int N = P.size();
  7.   vector < int > freq(N, 0);
  8.   for (auto it : C)
  9.   freq[it] ++;
  10.   vector < int > P_New (N, 0), poz (N, 0);
  11.   for (int i = 1; i < N; i ++)
  12.   poz[i] = poz[i - 1] + freq[i - 1];
  13.   for (auto it : P) {
  14.     P_New[poz[C[it]]] = it;
  15.     poz[C[it]] ++;
  16.   }
  17.   P = P_New;
  18. }
  19.  
  20. int main () {
  21.   ios_base::sync_with_stdio(false);
  22.   cin.tie(nullptr);
  23.   cout.tie(nullptr);
  24.   string s1, s2, s;
  25.   cin >> s1 >> s2;
  26.   int lg = s1.size();
  27.   for (int i = 0; i < lg; i ++)
  28.   s.push_back(s1[i]);
  29.   s.push_back('$');
  30.   lg = s2.size();
  31.   for (int i = 0; i < lg; i ++)
  32.   s.push_back(s2[i]);
  33.   s.push_back('#');
  34.   int N = s.size();
  35.   lg = s1.size();
  36.   vector < int > P(N), C(N);
  37.   vector < pair < char , int > > a(N);
  38.   for (int i = 0; i < N; i ++)
  39.   a[i] = {s[i], i};
  40.   sort (a.begin(), a.end());
  41.   for (int i = 0; i < N; i ++)
  42.   P[i] = a[i].second;
  43.   C[P[0]] = 0;
  44.   for (int i = 1; i < N; i ++)
  45.   if (a[i].first == a[i - 1].first)
  46.   C[P[i]] = C[P[i - 1]];
  47.   else
  48.   C[P[i]] = C[P[i - 1]] + 1;
  49.   int k = 0;
  50.   while ((1 << k) < N) {
  51.     for (int i = 0; i < N; i ++)
  52.     P[i] = (P[i] - (1 << k) + N) % N;
  53.     CountingSort (P, C);
  54.     vector < int > C_New (N, 0);
  55.     for (int i = 1; i < N; i ++) {
  56.       pair < int , int > Prev = {C[P[i - 1]], C[(P[i - 1] + (1 << k)) % N]},
  57.                          Now = {C[P[i]], C[(P[i] + (1 << k)) % N]};
  58.       if (Now == Prev)
  59.       C_New[P[i]] = C_New[P[i - 1]];
  60.       else
  61.       C_New[P[i]] = C_New[P[i - 1]] + 1;
  62.     }
  63.     C = C_New;
  64.     k ++;
  65.   }
  66.   vector < int > LCP (N);
  67.   k = 0;
  68.   for (int i = 0; i < N - 1; i ++) {
  69.     int pi = C[i],
  70.         j = P[pi - 1];
  71.     while (s[i + k] == s[j + k])
  72.     k ++;
  73.     LCP[pi] = k;
  74.     k = max (k - 1, 0);
  75.   }
  76.   vector < int > Class (N);
  77.   for (int i = 0; i < N; i ++)
  78.   if (P[i] < lg)
  79.   Class[i] = 1;
  80.   else
  81.   Class[i] = 2;
  82.   int ans = 0, poz;
  83.   for (int i = 1; i < N; i ++)
  84.   if (Class[i] != Class[i - 1]) {
  85.     if (LCP[i] > ans) {
  86.       ans = LCP[i];
  87.       poz = P[i];
  88.     }
  89.   }
  90.   for (int i = poz; i < poz + ans; i ++)
  91.   cout << s[i];
  92.   return 0;
  93. }
  94.  
Advertisement
Add Comment
Please, Sign In to add comment