Link
https://ac.nowcoder.com/acm/contest/180/D
Description
Problem Statement
小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y
Input
第一行为一个整数n,表示元素个数
第二行一行包含n个整数,分别代表序列中的元素
第三行为一个整数Q,表示询问次数
接下来Q行,每行两个数x,y,含义如题所示
Output
输出Q行,若x可以变换为y,输出“YES”,否则输出“NO”
Sample Input
5
1 2 3 4 5
3
6 7
2 1
3 8
Sample Output
YES
YES
NO
Solution
就是一道裸的线性基,至于什么是线性基我还没搞明白,,,,,,
Code
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
//#include<unordered_map>
using namespace std;
#pragma GCC optimize(2)
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define maxn 200090
#define inf 1000000
#define PI acos(-1)
typedef long long ll;
struct edge{
int u,v,next,w;
}e[2];
int head[1],cnt;
void add(int x,int y,int w){
e[cnt].u=x;
e[cnt].v=y;
e[cnt].w=w;
e[cnt].next=head[x];
head[x]=cnt++;
e[cnt].u=y;
e[cnt].v=x;
e[cnt].w=w;
e[cnt].next=head[y];
head[y]=cnt++;
}
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int n,q,p[70],a;
void insert(int x){
for(int i=63;i>=0;i--){
if((x>>i)&1){
if(!p[i]){p[i]=x;break;}
x^=p[i];
}
}
return ;
}
int find(int x){
for(int i=63;i>=0;i--){
if((x>>i)&1){
x^=p[i];
if(x==0)return 1;
}
}
return 0;
}
int main(){
n=read();
for(int i=0;i<n;i++){
a=read();
insert(a);
}
q=read();
int b;
for(int i=0;i<q;i++){
a=read(),b=read();
if(find(a^b))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
我们坚持一件事情,并不是因为这样做了会有效果,而是坚信,这样做是对的。——哈维尔
*/