danielvitor23

Beautiful Words

Nov 2nd, 2021 (edited)
782
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int64_t MOD = (1LL<<61)-1;
  5. const int base = 31;
  6.  
  7. int64_t p[100005];
  8.  
  9. int64_t modMul(int64_t a, int64_t b) {
  10.   return (__int128_t)a*b%MOD;
  11. }
  12.  
  13. struct StringHashing {
  14.     inline int getInt(char c) {
  15.         return (c-'a'+1);
  16.     }
  17.     /*
  18.         hs[i] = s[0]*p^(i) + s[1]*p(i-1) + ... + s[i-1]*p + s[i]
  19.     */
  20.     vector<int64_t> hs;
  21.     StringHashing () {}
  22.     StringHashing (const string &s) {
  23.         int n = s.size();
  24.         hs.resize(n);
  25.         hs[0] = getInt(s[0]);
  26.         for (int i = 1; i < n; ++i) {
  27.             hs[i] = modMul(hs[i-1], base) + getInt(s[i]);
  28.       if (hs[i] >= MOD) {
  29.         hs[i] -= MOD;
  30.       }
  31.         }
  32.     }
  33.     /*
  34.         hs[i..j] = hs[j] - hs[i-1] * p^(j-i+1)
  35.     */
  36.     int64_t getValue(int l, int r) {
  37.         if (l > r) return -1;
  38.         int64_t res = hs[r];
  39.         if (l > 0) {
  40.       res -= modMul(p[r-l+1], hs[l-1]);
  41.       if (res < 0) {
  42.         res += MOD;
  43.       }
  44.     }
  45.         return res;
  46.     }
  47. };
  48.  
  49. int n, m;
  50. string a, aux;
  51. vector<string> s;
  52. vector<int64_t> vec;
  53. StringHashing sh, sh1;
  54.  
  55. bool f(int k) {
  56.  
  57.   vec.clear();
  58.   for (int i = 0; i < (int)aux.size()-k+1; ++i) {
  59.     vec.push_back(sh1.getValue(i, i+k-1));
  60.   }
  61.  
  62.   sort(vec.begin(), vec.end());
  63.  
  64.   vector<int> vet(2*n+1, 0);
  65.  
  66.   for (int i = 0; i < 2*n-k+1; ++i) {
  67.     if (binary_search(vec.begin(), vec.end(), sh.getValue(i, i+k-1))) {
  68.       int l = max(0, i+k-n);
  69.       int r = i;
  70.       ++vet[l];
  71.       --vet[r+1];
  72.     }
  73.   }
  74.  
  75.   bool ok = vet[0];
  76.   for (int i = 1; i < n; ++i) {
  77.     vet[i] += vet[i-1];
  78.     ok &= (vet[i] > 0);
  79.   }
  80.  
  81.   return ok;
  82. }
  83.  
  84. int main() {
  85.   cin.tie(0)->sync_with_stdio(0);
  86.  
  87.   p[0] = 1;
  88.   for (int i = 1; i < 100002; ++i) {
  89.     p[i] = modMul(p[i-1], base);
  90.   }
  91.  
  92.   cin >> n >> m;
  93.   cin >> a;
  94.   a += a;
  95.  
  96.   s.resize(m);
  97.   int lo = 1, hi = 0, mid = -1, ans = 0;
  98.   for (int i = 0; i < m; ++i) {
  99.     cin >> s[i];
  100.     hi = max(hi, (int)s[i].size());
  101.   }
  102.   hi = min(hi, n);
  103.  
  104.   for (string &sr : s) {
  105.     aux += '#' + sr;
  106.   }
  107.  
  108.   sh1 = StringHashing(aux);
  109.   sh = StringHashing(a);
  110.  
  111.   while (lo <= hi) {
  112.     mid = (lo + hi) / 2;
  113.     if (f(mid)) {
  114.       ans = mid;
  115.       lo = mid+1;
  116.     } else {
  117.       hi = mid-1;
  118.     }
  119.   }
  120.  
  121.   cout << ans << '\n';
  122. }
Add Comment
Please, Sign In to add comment