思路:

  1. 遍历数列中的每个数,计算该数与X的异或结果,并将该结果作为键存入一个哈希表中,同时统计每个结果出现的次数。
  2. 再次遍历数列中的每个数,计算该数与X的异或结果,并在哈希表中查找该结果,将该结果出现的次数累加到答案中。
  3. 返回答案。

代码实现如下:

#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,因此该算法在数据范围内可以接受。

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分别表示

原文地址: https://www.cveoy.top/t/topic/i49I 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录