C++Venn 有一个数列 a1 a2 an。 有一天 BLUESKY007 拿来了一个正整数 X。Venn 是一个特别喜欢异或xor运算的孩子她也很喜欢 BLUESKY007。于是Venn 就想知道自己能找到多少对数i j能够满足 ai xor aj = X。 两个数对 i1 j1与i2 j2不同当且仅当 i1 ≠ i2 或者 j1 ≠ j2。【输入格式】第一行两个正整数 n X分别表示
思路:
- 遍历数列中的每个数,计算该数与X的异或结果,并将该结果作为键存入一个哈希表中,同时统计每个结果出现的次数。
- 再次遍历数列中的每个数,计算该数与X的异或结果,并在哈希表中查找该结果,将该结果出现的次数累加到答案中。
- 返回答案。
代码实现如下:
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
int n, X;
cin >> n >> X;
int a[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
unordered_map<int, int> xorCount;
for (int i = 0; i < n; i++) {
int xorResult = a[i] ^ X;
xorCount[xorResult]++;
}
int ans = 0;
for (int i = 0; i < n; i++) {
int xorResult = a[i] ^ X;
ans += xorCount[xorResult];
}
cout << ans << endl;
return 0;
}
时间复杂度分析: 该算法需要遍历两次数列,因此时间复杂度为O(n)。由于n的最大值为1000000,因此该算法在数据范围内可以接受。
原文地址: https://www.cveoy.top/t/topic/i49I 著作权归作者所有。请勿转载和采集!