87072024-01-25 20:46:47mraronTúlcsorduláscpp17Accepted 100/100421ms30752 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] << " ";
    }

    return 0;
}

SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted182ms14476 KiB
2Accepted180ms14760 KiB
subtask240/40
3Accepted180ms14716 KiB
4Accepted181ms15044 KiB
5Accepted181ms15196 KiB
6Accepted181ms15768 KiB
7Accepted182ms15560 KiB
8Accepted185ms15976 KiB
9Accepted184ms16188 KiB
subtask330/30
10Accepted181ms15872 KiB
11Accepted200ms16732 KiB
12Accepted264ms21584 KiB
13Accepted268ms24228 KiB
14Accepted347ms29588 KiB
15Accepted421ms28868 KiB
16Accepted405ms28616 KiB
17Accepted411ms30008 KiB
subtask430/30
18Accepted187ms17308 KiB
19Accepted234ms29872 KiB
20Accepted261ms20240 KiB
21Accepted316ms27036 KiB
22Accepted405ms30540 KiB
23Accepted421ms30612 KiB
24Accepted418ms29940 KiB
25Accepted412ms29444 KiB
26Accepted418ms30752 KiB
27Accepted414ms30752 KiB
28Accepted409ms30744 KiB