用 hi 代表前 i 个数中每个数的数量的哈希值,且 hi=j=1∑ncjpj,其中 ck 代表 k 的个数。查询 l1,r1,l2,r2 时,判断 hr1−l1−1−hr2−l2−1 是否相等。取 p=2,100113,100111,模数为自然溢出,998244353,109+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;
}