分析
小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y
输入描述:
第一行为一个整数n,表示元素个数,第二行一行包含n个整数,分别代表序列中的元素,第三行为一个整数Q,表示询问次数,接下来Q行,每行两个数x,y,含义如题所示。
输出描述:
输出Q行,若x可以变换为y,输出“YES”,否则输出“NO”
示例1
输入
5
1 2 3 4 5
3
6 7
2 1
3 8
输出
YES
YES
NO
分析
一道线性基的板子题。
上代码
#pragma gcc optimize(2)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,al[100010],dd[100100],q,x,y;
void cl(ll x){
for(int i=62;i>-1;i--){
if(!(x>>i))
continue;
if(!dd[i]){
dd[i]=x;
break;
}
x^=dd[i];
}
return;
}
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&al[i]);
cl(al[i]);
}
scanf("%lld",&q);
while(q--){
scanf("%lld%lld",&x,&y);
ll zxy=x^y;
for(int i=62;i>-1;i--)
if((zxy>>i)&1)
zxy^=dd[i];
if(!zxy)
puts("YES");
else
puts("NO");
}
return 0;
}