判断集合S中的一些元素异或后能否得到 x^y
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N = 1e2 + 10;
int n, m, x, y, a[N];
const int MX = 32; // 二进制位数
int add_ele(int x, int *a, int op){
int flag = 0;
for(int j=MX-1;j>=0;j--) {
if(x & (1<<j)) {
if(a[j]) x ^= a[j];
else { if(!op) a[j] = x; flag = j+1; break;}
}
}
return flag;
}
void slove(int n, int *a) {
for(int i=0;i<MX;i++) a[i] = 0;
for(int i=1;i<=n;i++) scanf("%d", &x), add_ele(x, a, 0);
for(int i=0;i<MX;i++) if(a[i]) for(int j=i+1;j<32;j++) if(a[j] & (1<<i)) a[j] ^= a[i];
}
int main()
{
scanf("%d", &n); slove(n, a); scanf("%d", &m);
while(m--) {
scanf("%d%d", &x, &y); x = x ^ y;
if(!add_ele(x, a, 1)) puts("YES");
else puts("NO");
}
return 0;
}