为什么我这种做法会 WA
查看原帖
为什么我这种做法会 WA
555825
block_in_mc楼主2024/8/19 11:24

用 hih_{i} 代表前 ii 个数中每个数的数量的哈希值,且 hi=∑j=1ncjpjh_i=\sum\limits_{j=1}^nc_jp^j,其中 ckc_k 代表 kk 的个数。查询 l1,r1,l2,r2l_1,r_1,l_2,r_2 时,判断 hr1−l1−1−hr2−l2−1h_{r_1-l_1-1}-h_{r_2-l_2-1} 是否相等。取 p=2,100113,100111p=2,100113,100111,模数为自然溢出,998244353998244353,109+710^9+7。

AC*42,WA*18。

#include <bits/stdc++.h>
using namespace std;
const int P = 998244353, P2 = 1000000007;
typedef unsigned long long ull;
int n, q, l1, r1, l2, r2, a[200100], b[200100];
ull pw[200200], ha[200100], hb[200100];
long long ha2[200100], hb2[200100], ha3[200100], hb3[200100], pw2[200100], pw3[200100];
int main() {
    scanf("%d%d", &n, &q);
    pw[0] = 1;
    for (int i = 1; i <= n; i++)
        pw[i] = pw[i - 1] * 2;
    pw2[0] = 1;
    for (int i = 1; i <= n; i++)
        pw2[i] = (pw2[i - 1] * 100113) % P;
    pw3[0] = 1;
    for (int i = 1; i <= n; i++)
        pw3[i] = (pw3[i - 1] * 100111) % P2;
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++)
        scanf("%d", &b[i]);
    for (int i = 1; i <= n; i++)
        ha[i] = ha[i - 1] + pw[a[i]], ha2[i] = (ha2[i - 1] + pw2[a[i]]) % P, ha3[i] = (ha3[i - 1] + pw3[a[i]]) % P2,
        hb[i] = hb[i - 1] + pw[b[i]], hb2[i] = (hb2[i - 1] + pw2[b[i]]) % P, hb3[i] = (hb3[i - 1] + pw3[b[i]]) % P2;
    for (int i = 1; i <= q; i++) {
        scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
        if (ha[r1] - ha[l1 - 1] == ha[r2] - ha[l2 - 1] && ((ha2[r1] - ha2[l1 - 1]) % P + P) % P == ((hb2[r2] - hb2[l2 - 1]) % P + P) % P && ((ha3[r1] - ha3[l1 - 1]) % P2 + P2) % P2 == ((hb3[r2] - hb3[l2 - 1]) % P2 + P2) % P2) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
2024/8/19 11:24
加载中...