87092024-01-25 21:43:20mraronTúlcsorduláscpp17Accepted 100/100419ms30592 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
1Accepted180ms14440 KiB
2Accepted180ms14760 KiB
subtask240/40
3Accepted180ms14844 KiB
4Accepted180ms14812 KiB
5Accepted180ms14824 KiB
6Accepted180ms15340 KiB
7Accepted181ms15732 KiB
8Accepted182ms15800 KiB
9Accepted182ms15676 KiB
subtask330/30
10Accepted180ms15416 KiB
11Accepted201ms16404 KiB
12Accepted268ms21088 KiB
13Accepted266ms23812 KiB
14Accepted347ms29244 KiB
15Accepted404ms28612 KiB
16Accepted409ms28156 KiB
17Accepted409ms29500 KiB
subtask430/30
18Accepted188ms17060 KiB
19Accepted231ms29972 KiB
20Accepted261ms20152 KiB
21Accepted314ms26672 KiB
22Accepted409ms29996 KiB
23Accepted409ms30156 KiB
24Accepted398ms29796 KiB
25Accepted397ms29288 KiB
26Accepted419ms30360 KiB
27Accepted418ms30376 KiB
28Accepted407ms30592 KiB