xor序列
题意:给出n个数,问能否将x跟任意的这n个数异或和为y;
思路:线性基。x^z=y ==>x^y=z 其实就是线性基的插入以及判断z是否在线性基里。
#include<bits/stdc++.h>
using namespace std;
long long b[60];
typedef long long ll;
void ins(int x){
for(int i=32;i>=0;i--){
if(x&(1ll<<i)){
if(!b[i]){
b[i]=x;
return;
}
x^=b[i];
}
}
}
int find(int x){
for(int i=32;i>=0;i--){
if(x&(1ll<<i)){
if(!b[i])
return 0;
x^=b[i];
}
}
return 1;
}
int main(){
int n;
scanf("%d",&n);
int x;
for(int i=0;i<n;i++){
scanf("%d",&x);
ins(x);
}
int q;
scanf("%d",&q);
while(q--){
int y;
scanf("%d%d",&x,&y);
if(find(x^y))
puts("YES");
else puts("NO");
}
}
线性基插入一个数
void insert(int x)
{
for(int i=20;i>=0;i--)
if(x&(1<<i))
{
if(!a[i])
{
a[i]=x;
return;
}
x^=a[i];
}
}
查询能否xor出x这个数:
bool find(int x)
{
for(int i=20;i>=0;i--)
if(x&(1<<i))
{
if(!a[i])return false;
x^=a[i];
}
return true;
}
查询最大值:
int query()
{
res=0;
for(int i=20;i>=0;i--)
res=max(res,res^a[i]);
return res;
}
查询最小值:
int query()
{
for(int i=0;i<=20;i++)
if(a[i])return a[i];
}