skimono

Untitled

Mar 7th, 2024
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. #pragma optimize ("O3");
  2. #define _CRT_SECURE_NO_WARNINGS
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <set>
  7. #include <algorithm>
  8. #include <map>
  9. #include <string>
  10. #include <unordered_map>
  11. #include <cassert>
  12. #include <bitset>
  13.  
  14. using namespace std;
  15. //#define int long long
  16. const int inf = 2e9;
  17. const long long m1 = 998244353;
  18. const long long m2 = 1e9 + 7;
  19.  
  20. int gcd(int a, int b) {
  21.     if (a == 0 || b == 0) {
  22.         return a + b;
  23.     }
  24.     if (a > b) {
  25.         return gcd(a % b, b);
  26.     }
  27.     else {
  28.         return gcd(a, b % a);
  29.     }
  30. }
  31.  
  32. const int N = 1e6 + 1;
  33. unsigned long long hsh[N];
  34. unsigned long long pw[N];
  35. unsigned long long k = 347;
  36. int a[N];
  37. string w[N];
  38.  
  39. void solve() {
  40.     int n, m, i, j, next, g, it = 0;
  41.     cin >> n >> m;
  42.     for (i = 0; i < n; i++) {
  43.         cin >> w[i];
  44.     }
  45.     for (i = 0; i < m; i++) {
  46.         cin >> a[i];
  47.     }
  48.     g = a[0];
  49.     for (i = 0; i < n; i++) {
  50.         g = gcd(g, w[i].size());
  51.     }
  52.     for (i = 0; i < m; i++) {
  53.         g = gcd(g, a[i]);
  54.     }
  55.     vector <unsigned long long> cq;
  56.     unsigned long long sup, sup2, el;
  57.     for (i = 0; i < n; i++) {
  58.         sup = 0;
  59.         for (j = 1; j <= w[i].size(); j++) {
  60.             el = w[i][j - 1] - 'a' + 1;
  61.             sup = sup * k + el;
  62.             if (j % g == 0) {
  63.                 cq.push_back(sup);
  64.             }
  65.         }
  66.         cq.push_back(sup);
  67.     }
  68.     sort(cq.begin(), cq.end());
  69.     cq.resize(unique(cq.begin(), cq.end()) - cq.begin());
  70.     pw[0] = 1;
  71.     for (i = 1; i < N;i++) {
  72.         pw[i] = pw[i - 1] * k;
  73.     }
  74.     int q;
  75.     cin >> q;
  76.     string s;
  77.     int l, r, md, sz;
  78.     //Fuck it
  79.     while (q--) {
  80.         cin >> s;
  81.         sz = s.size();
  82.         for (i = 1; i <= sz; i++) {
  83.             el = s[i - 1] - 'a' + 1;
  84.             hsh[i] = hsh[i - 1] * k + el;
  85.         }
  86.         l = 0, r = (sz + g - 1) / g + 2;
  87.         next = 0;
  88.         while (r - l > 1) {
  89.             md = (l + r) / 2;
  90.             if (md * g > sz) {
  91.                 r = md;
  92.                 continue;
  93.             }
  94.             if (binary_search(cq.begin(), cq.end(), hsh[md * g])) {
  95.                 l = md;
  96.             }
  97.             else {
  98.                 r = md;
  99.             }
  100.         }
  101.         next = max(next, l * g);
  102.         for (i = g; i <= sz && next < sz; i += g) {
  103.             if (next < i) {
  104.                 break;
  105.             }
  106.             l = 0, r = (sz - i + g) / g + 2;
  107.             while (r - l > 1) {
  108.                 md = (l + r) / 2;
  109.                 if (i + md * g > sz) {
  110.                     r = md;
  111.                     continue;
  112.                 }
  113.                 if (binary_search(cq.begin(), cq.end(), hsh[i + md * g] - hsh[i] * pw[md * g])) {
  114.                     l = md;
  115.                 }
  116.                 else {
  117.                     r = md;
  118.                 }
  119.             }
  120.             next = max(next, i + l * g);
  121.         }
  122.         if (next >= sz) {
  123.             cout << "Yes" << '\n';
  124.         }
  125.         else {
  126.             cout << "No" << '\n';
  127.         }
  128.     }
  129. }
  130.  
  131. signed main() {
  132. #ifdef _DEBUG
  133.     freopen("input.txt", "r ", stdin);
  134.     freopen("output.txt", "w", stdout);
  135. #endif
  136.     ios_base::sync_with_stdio(0);
  137.     cin.tie(NULL);
  138.     cout.tie(NULL);
  139.     int t = 1;
  140.     //cin >> t;
  141.     while (t--) solve();
  142. }
  143. //Deisgned by skimono
  144.  
Add Comment
Please, Sign In to add comment