题意
给定两个数组 a a a, b b b, 每次询问 a a a 前缀上的 x x x 个数所形成的集合与 b b b 前缀上的 y y y 个数所形成的集合是否相同。集合不包含重复数字。
题解
使用 Z o b r i s t Zobrist Zobrist 哈希可以直接完成此题。其使用方法就是用一个大随机数来表示一个数。这是一种确定两个集合是否相等的概率算法。
代码
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
mt19937_64 mrand(random_device{}());
ull ha[200010], hb[200010];
map<int, ull> cnt;
set<int> cnta, cntb;
int main() {
int n, q;
cin >> n;
for (int i = 1; i <= n; i ++) {
int a; cin >> a;
if (!cnt.count(a)) cnt[a] = mrand();
ha[i] = ha[i-1];
if (!cnta.count(a)) ha[i] += cnt[a];
cnta.insert(a);
}
for (int i = 1; i <= n; i ++) {
int b; cin >> b;
if (!cnt.count(b)) cnt[b] = mrand();
hb[i] = hb[i-1];
if (!cntb.count(b)) hb[i] += cnt[b];
cntb.insert(b);
}
cin >> q;
while (q --) {
int x, y;
cin >> x >> y;
puts(ha[x] == hb[y] ? "Yes" : "No");
}
}