8703 2024. 01. 25 20:24:42 szil Túlcsordulás cpp17 Elfogadva 100/100 421ms 30064 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) {
        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;
}

Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 180ms 14436 KiB
2 Elfogadva 180ms 14764 KiB
subtask2 40/40
3 Elfogadva 180ms 14972 KiB
4 Elfogadva 180ms 15336 KiB
5 Elfogadva 181ms 15256 KiB
6 Elfogadva 180ms 15576 KiB
7 Elfogadva 184ms 15568 KiB
8 Elfogadva 182ms 15656 KiB
9 Elfogadva 182ms 15864 KiB
subtask3 30/30
10 Elfogadva 180ms 15588 KiB
11 Elfogadva 200ms 16316 KiB
12 Elfogadva 264ms 20896 KiB
13 Elfogadva 263ms 23516 KiB
14 Elfogadva 335ms 28840 KiB
15 Elfogadva 402ms 28220 KiB
16 Elfogadva 400ms 27752 KiB
17 Elfogadva 395ms 28924 KiB
subtask4 30/30
18 Elfogadva 187ms 16460 KiB
19 Elfogadva 226ms 29020 KiB
20 Elfogadva 259ms 19256 KiB
21 Elfogadva 317ms 25916 KiB
22 Elfogadva 402ms 29424 KiB
23 Elfogadva 412ms 29640 KiB
24 Elfogadva 421ms 29224 KiB
25 Elfogadva 405ms 28964 KiB
26 Elfogadva 407ms 30052 KiB
27 Elfogadva 418ms 30064 KiB
28 Elfogadva 407ms 30060 KiB