加载中...

牛客周赛102 G(异或哈希trick)

牛客周赛102 G

简述题意:给定长度为 \(n\) 的序列与 \(q\) 次查询,每次查询区间 \(a[l, r]\) 内是否为双排列。

双排列:长度为偶数 \(n\),且数字 \(1,2,...,\frac{n}{2}\) 均恰好出现 \(2\) 次。

做法:不难想到先用最普通的异或哈希方法,通过查询区间异或值为 \(0\)保证区间内每种数的出现次数均为偶数

其次,区间内需要保证 \(1\backsim \frac{(r - l + 1)}{2}\) 中每个数均出现。那么我们不难想到用 哈希二进制集合 来判断这件事情:可以预处理 \(1\backsim max(a)\) 的所有前缀异或哈希值,进而可以做到 \(O(1)\) 查询区间内 \(1\backsim \frac{(r - l + 1)}{2}\) 是否均出现。而对于原序列,可以对每种数交替赋上对应哈希值(不赋值则为0)。这样对于任意数字,在区间内出现次数为 \(x\) 时(\(x\) 为偶数),一定只有 \(\frac{x}{2}\) 个数赋上了相应的哈希值。那么显然只有这个数出现 \(2\) 次才会对哈希异或有贡献,否则无贡献

保证了上述两个性质,即可证明查询区间为双排列。具体细节见代码。

code

posted @ 2025-07-30 14:15  jxs123  阅读(8)  评论(0)    收藏  举报