https://ac.nowcoder.com/acm/problem/17968
Problem
给出n个数,q次询问,问x和这n个数中的任意多个数异或是否能够得到y
Solution
线性基模板。线性基请看这位大佬博客:https://blog.csdn.net/a_forever_dream/article/details/83654397
首先要知道线性基的概念:线性基是一个数组,该数组由原序列构造而来,原序列中的每一个数都能由线性基中的若干个数异或而来。
线性基的构造:
bool insert(int x,int k){
for(int i = 60; i >= 0; i--){
if(x&((1ll*1)<<i)){
if(d[i]) x ^= d[i];
else{
if(k == 2) return false;
d[i] = x;
break;
}
}
}
return x == 0;
}
这题要构造x^a^b^c... = y
等价于 a^b^c...=y^x
所以先预处理出原序列的线性基,再看能否得到y^x.判断方法就是看y^x能否插入线性基中。
Code
#include <bits/stdc++.h>
#define ll long long
const int N = 1e6+7;
const int mod = 1e9+7;
const ll ds = 1e15;
const double eps = 1e-8;
using namespace std;
int a[N],d[105];
bool insert(int x,int k){
for(int i = 60; i >= 0; i--){
if(x&((1ll*1)<<i)){
if(d[i]) x ^= d[i];
else{
if(k == 2) return false;
d[i] = x;
break;
}
}
}
return x == 0;
}
void solve(){
int n,q,x,y,g;
bool flag;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> x;
flag = insert(x,1);
}
flag = true;
cin >> q;
while(q--){
cin >> x >> y;
flag = insert(x^y,2);
if(!flag) puts("NO");
else puts("YES");
}
}
int main(){
// int t;
// cin >> t;
// while(t--)
solve();
//system("pause");
return 0;
}