87102024-01-25 21:45:29szilTúlcsorduláscpp17Accepted 100/100435ms30492 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int MAXN = 200'010;
const int HASH_CNT = 2;
const ll MOD = 1e9+7;

ll mult(ll a, ll b){return (a*b)%MOD;}
ll poww(ll a, ll b){
    if(b==0)return 1LL;
    if(b&1)return mult(poww(a, b-1), a);
    ll c = poww(a, b/2);
    return mult(c, c);
}

ll eredeti_primes[1000] = {3, 5, 7, 11};
ll primes[MAXN][HASH_CNT], inv_primes[MAXN][HASH_CNT];


struct Hash {
    ll val[HASH_CNT];

    bool operator==(const Hash &x) const {
        for (int i = 0; i < HASH_CNT; i++) if (val[i] != x.val[i]) return false;
        return true;
    }
};

bool a[MAXN], b[MAXN];
Hash ha[MAXN], hb[MAXN];

Hash H(Hash *arr, int l, int r) {
    Hash res;
    for (int i = 0; i < HASH_CNT; i++) {
        res.val[i] = (arr[r].val[i] - arr[l-1].val[i] + MOD) % MOD;
        res.val[i] = mult(res.val[i], inv_primes[l-1][i]); // TODO check
    }
    return res;
}

int main(){
    cin.tie(0); cin.sync_with_stdio(0);
    for(int i = 0; i < HASH_CNT; i++){
        primes[0][i] = 1;
        inv_primes[0][i] = 1;
        for(int j = 1; j < MAXN; j++){
            primes[j][i] = (primes[j-1][i] * eredeti_primes[i]) % MOD;
            inv_primes[j][i] = poww(primes[j][i], MOD-2);
        }
    }
    int n; cin >> n;
    for (int i = 1; i <= n; i++) {
        char c; cin >> c;
        a[i] = 1-(c-'0');
    }

    for (int i = 1; i <= n; i++) {
        char c; cin >> c;
        b[i] = c-'0';
    }
    
    for (int i = 0; i < HASH_CNT; i++) {
        for (int j = 1; j <= n; j++) {
            ha[j].val[i] = (ha[j-1].val[i] + a[j] * primes[j][i]) % MOD;
            hb[j].val[i] = (hb[j-1].val[i] + b[j] * primes[j][i]) % MOD;
        }
    }

    int q; cin >> q;
    while (q--) {
        int x, y, l; cin >> x >> y >> l;
        x++; y++;
        int lo = 0, hi = l; // TODO check
        while (lo < hi) {
            int mid = (lo + hi) / 2;
            if (H(ha, x, x+mid) == H(hb, y, y+mid)) {
                lo = mid + 1;
            } else {
                hi = mid;
            }
        }
        if (lo == l) cout << "1 ";
        else cout << 1-b[y+lo] << " ";
    }
    cout << "\n";
    return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted181ms14448 KiB
2Accepted180ms14772 KiB
subtask240/40
3Accepted181ms15096 KiB
4Accepted180ms15196 KiB
5Accepted181ms15412 KiB
6Accepted180ms15884 KiB
7Accepted180ms15900 KiB
8Accepted182ms16204 KiB
9Accepted182ms16164 KiB
subtask330/30
10Accepted180ms15776 KiB
11Accepted200ms16576 KiB
12Accepted266ms21136 KiB
13Accepted266ms23824 KiB
14Accepted335ms29288 KiB
15Accepted402ms28536 KiB
16Accepted400ms28448 KiB
17Accepted395ms29328 KiB
subtask430/30
18Accepted188ms16888 KiB
19Accepted225ms29556 KiB
20Accepted261ms19908 KiB
21Accepted307ms26592 KiB
22Accepted407ms30032 KiB
23Accepted409ms30172 KiB
24Accepted400ms29688 KiB
25Accepted391ms29232 KiB
26Accepted405ms30316 KiB
27Accepted435ms30308 KiB
28Accepted412ms30492 KiB