Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma optimize ("O3");
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <vector>
- #include <set>
- #include <algorithm>
- #include <map>
- #include <string>
- #include <unordered_map>
- #include <cassert>
- #include <bitset>
- using namespace std;
- //#define int long long
- const int inf = 2e9;
- const long long m1 = 998244353;
- const long long m2 = 1e9 + 7;
- int gcd(int a, int b) {
- if (a == 0 || b == 0) {
- return a + b;
- }
- if (a > b) {
- return gcd(a % b, b);
- }
- else {
- return gcd(a, b % a);
- }
- }
- const int N = 1e6 + 1;
- unsigned long long hsh[N];
- unsigned long long pw[N];
- unsigned long long k = 347;
- int a[N];
- string w[N];
- void solve() {
- int n, m, i, j, next, g, it = 0;
- cin >> n >> m;
- for (i = 0; i < n; i++) {
- cin >> w[i];
- }
- for (i = 0; i < m; i++) {
- cin >> a[i];
- }
- g = a[0];
- for (i = 0; i < n; i++) {
- g = gcd(g, w[i].size());
- }
- for (i = 0; i < m; i++) {
- g = gcd(g, a[i]);
- }
- vector <unsigned long long> cq;
- unsigned long long sup, sup2, el;
- for (i = 0; i < n; i++) {
- sup = 0;
- for (j = 1; j <= w[i].size(); j++) {
- el = w[i][j - 1] - 'a' + 1;
- sup = sup * k + el;
- if (j % g == 0) {
- cq.push_back(sup);
- }
- }
- cq.push_back(sup);
- }
- sort(cq.begin(), cq.end());
- cq.resize(unique(cq.begin(), cq.end()) - cq.begin());
- pw[0] = 1;
- for (i = 1; i < N;i++) {
- pw[i] = pw[i - 1] * k;
- }
- int q;
- cin >> q;
- string s;
- int l, r, md, sz;
- //Fuck it
- while (q--) {
- cin >> s;
- sz = s.size();
- for (i = 1; i <= sz; i++) {
- el = s[i - 1] - 'a' + 1;
- hsh[i] = hsh[i - 1] * k + el;
- }
- l = 0, r = (sz + g - 1) / g + 2;
- next = 0;
- while (r - l > 1) {
- md = (l + r) / 2;
- if (md * g > sz) {
- r = md;
- continue;
- }
- if (binary_search(cq.begin(), cq.end(), hsh[md * g])) {
- l = md;
- }
- else {
- r = md;
- }
- }
- next = max(next, l * g);
- for (i = g; i <= sz && next < sz; i += g) {
- if (next < i) {
- break;
- }
- l = 0, r = (sz - i + g) / g + 2;
- while (r - l > 1) {
- md = (l + r) / 2;
- if (i + md * g > sz) {
- r = md;
- continue;
- }
- if (binary_search(cq.begin(), cq.end(), hsh[i + md * g] - hsh[i] * pw[md * g])) {
- l = md;
- }
- else {
- r = md;
- }
- }
- next = max(next, i + l * g);
- }
- if (next >= sz) {
- cout << "Yes" << '\n';
- }
- else {
- cout << "No" << '\n';
- }
- }
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r ", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(0);
- cin.tie(NULL);
- cout.tie(NULL);
- int t = 1;
- //cin >> t;
- while (t--) solve();
- }
- //Deisgned by skimono
Add Comment
Please, Sign In to add comment