Problem:
给一个数组,一个值x,求这个数组中有多少对儿数的异或值是x。
Solution:
枚举数组中的每一个数,因为a^b=c,则a^c=b,所以利用每一个数和x异或找到b,然后在数组中搜索,利用计数排序的思想,在常数时间内就可以找到这个值是否存在。复杂度便可以到了O(n)。
note:
异或的公式要足够熟悉,计数排序的思想要掌握。
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<vector>
#include<fstream>
#include<list>
using namespace std;
#define ms(s) memset(s,0,sizeof(s))
typedef unsigned long long ULL;
typedef long long LL;
const double PI = 3.141592653589;
const int INF = 0x3fffffff;
LL num[100010];
int main(){
// freopen("/Users/really/Documents/code/input","r",stdin);
// freopen("/home/really/Document/output","w",stdout);
// ios::sync_with_stdio(false);
LL n, x, t;
LL tot = 0;
ms(num);
scanf("%I64d%I64d", &n, &x);
for(int i = 1; i <= n; ++i){
scanf("%lld", &t);
num[t]++;
}
for(int i = 1; i <= 100000; ++i){
if(num[i] > 0){
LL ans = i^x;
if(ans == i)
tot += num[i]*(num[i]-1);
else if(ans>=1 && ans<=100000 && num[ans]>0)
tot += num[ans]*num[i];
}
}
printf("%I64d\n", tot/2);
return 0;
}