Salvens

B

Aug 8th, 2023
918
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <array>
  4. #include <vector>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. #define int long long
  10. #pragma comment(linker,"/STACK:1000000000,1000000000")
  11.  
  12. const long long INF = 1e9 + 7;
  13. const int MAXN = 2e5 + 10;
  14. const int N = 1e5 + 10;
  15.  
  16. const int M1 = 1e9 + 123;
  17. const int M2 = 1e9 + 321;
  18. const int P1 = 22811;
  19. const int P2 = 22699;
  20. array<int, MAXN> power1, power2;
  21.  
  22. void init_pow() {
  23.     power1[0] = 1;
  24.     power2[0] = 1;
  25.     for (int i = 1; i < MAXN; ++i) {
  26.         power1[i] = (power1[i - 1] * P1) % M1;
  27.         power2[i] = (power2[i - 1] * P2) % M2;
  28.     }
  29. }
  30.  
  31. void build_hash(string& s, vector<pair<int, int>>& h) {
  32.     int n = s.size();
  33.     h.resize(n + 1);
  34.     h[0].first = 0;
  35.     h[0].second = 0;
  36.  
  37.     for (int i = 0; i < n; ++i) {
  38.         h[i + 1].first = (h[i].first + (s[i] - 'a' + 1) * power1[i]) % M1;
  39.         h[i + 1].second = (h[i].second + (s[i] - 'a' + 1) * power2[i]) % M2;
  40.     }
  41. }
  42.  
  43. pair<int, int> get_hash(vector<pair<int, int>>& h, int pos, int len, int mx_pow = 0) {
  44.     int h1 = h[pos + len].first - h[pos].first;
  45.     int h2 = h[pos + len].second - h[pos].second;
  46.     if (h1 < 0) {
  47.         h1 += M1;
  48.     }
  49.     if (h2 < 0) {
  50.         h2 += M2;
  51.     }
  52.     if (mx_pow != 0) {
  53.         h1 = h1 * power1[mx_pow - (pos + len - 1)] % M1;
  54.         h2 = h2 * power2[mx_pow - (pos - + len - 1)] % M2;
  55.     }
  56.     return make_pair(h1, h2);
  57. }
  58.  
  59. bool is_equal(vector<pair<int, int>>& h_l, vector<pair<int, int>>& h_r, int start1, int start2, int len) {
  60.     pair<int, int> d_l, d_r;
  61.     d_l.first = ((h_l[start1 + len].first - h_l[start1].first + M1) * power1[start2]) % M1;
  62.     d_l.second = ((h_l[start1 + len].second - h_l[start1].second + M2) * power2[start2]) % M2;
  63.  
  64.     d_r.first = ((h_r[start2 + len].first - h_r[start2].first + M1) * power1[start1]) % M1;
  65.     d_r.second = ((h_r[start2 + len].second - h_r[start2].second + M2) * power2[start1]) % M2;
  66.  
  67.     return d_l == d_r;
  68. }
  69.  
  70. signed main() {
  71.     ios_base::sync_with_stdio(false);
  72.     cin.tie(nullptr);
  73.     cout.tie(nullptr);
  74.  
  75.     int n;
  76.     cin >> n;
  77.     string a, b;
  78.     cin >> a >> b;
  79.  
  80.     vector<pair<int, int>> h_a, h_b;
  81.     init_pow();
  82.     build_hash(a, h_a);
  83.     build_hash(b, h_b);
  84.  
  85.     int l = 0, r = n + 1;
  86.     vector<pair<int, int>> segs;
  87.     int ans_pos;
  88.     while (r - l > 1) {
  89.         int mid = (r + l) / 2;
  90.  
  91.         segs.clear();
  92.         for (int i = 0; i + mid <= n; ++i) {
  93.             segs.emplace_back(get_hash(h_a, i, mid, n));
  94.         }
  95.  
  96.         int pos = -1;
  97.         sort(segs.begin(), segs.end());
  98.         for (int i = 0; i + mid <= n; ++i) {
  99.             if (binary_search(segs.begin(), segs.end(), get_hash(h_b, i, mid, n))) {
  100.                 pos = i;
  101.                 break;
  102.             }
  103.         }
  104.  
  105.         if (pos >= 0) {
  106.             l = mid;
  107.             ans_pos = pos;
  108.         } else {
  109.             r = mid;
  110.         }
  111.     }
  112.     cout << b.substr(ans_pos, l) << '\n';
  113. }
Advertisement
Add Comment
Please, Sign In to add comment