一个线性基模板题:
给出一组数,给出x,y,查询这组数能否和 x 异或得到 y。
设我们这组数能异或出来z x^z=y, 那么x^y =z ,这样我们就转化为: 能否异或出x^y.
模板题;题目连接:https://ac.nowcoder.com/acm/contest/180/D?&headNav=www
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+50,mx=35;
struct Node{
int num[mx];
void init(){
memset(num,0,sizeof(num));
}
void insert(int x){//
for(int i=32;~i;i--){
if((x>>i)&1){//这一位有数字
if(!num[i]){
num[i]=x;
break;
}else{
x^=num[i];
}
}
}
}
bool check(int x){//x是不是向量中的数字
for(int i=32;i>=0;i--){
if((x>>i)&1){
if(!num[i])return 0;
else x^=num[i];
}
}
if(x==0)return 1;
return 0;
}//判断目标值的每一位是否在线性基中存在
} a;
int main(){
int n,m;
scanf("%d",&n);
a.init();
for(int x,i=0;i<n;i++){
scanf("%d",&x);
a.insert(x);
}
scanf("%d",&m);
for(int x,y,i=0;i<m;i++){
scanf("%d%d",&x,&y);//能否和x异或得到y,那么x异或y也就等于那个数据,
x^=y;
if(a.check(x))printf("YES\n");
else printf("NO\n");
}
return 0;
}