// 五十多行火车头优化省略了
#include <bits/stdc++.h>
using namespace std;
int n, s, a[1919810];
int ax[1919810];
map <int, int> m;
signed main () {
scanf ("%d%d", &n, &s);
for (int i = 1; i <= n; i++) {
scanf ("%d", &a[i]);
ax[i] = (a[i] ^ s);
m[a[i]]++;
}
if (s == 0) {
printf ("%d\n", n);
exit (0);
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans += m.find (ax[i])->second;
}
printf ("%d\n", ans);
}
题目大意:给出 n 和 s 以及长度为 n 的集合 a,让你求集合中满足 aixoraj=s 的数对个数,(i,j) 和 (j,i) 视作不同数对。
思路:aixoraj=s⇒aixoraj=s。记录每一个 aixors,用 std::map 记录出现每个数的出现次数。
1≤n≤106,1≤ai≤230,1≤s≤230。
不开火车头 TLE 50pts,开了之后 TLE 70pts,求助要怎么优化 QAQ