题目要求的式子:
两边同时异或得:
这个式子就是线性基的检查操作,直接写上即可。
附代码:
#include<iostream> #include<algorithm> #include<cstdio> #define MAXN 40 using namespace std; int n,m,max_val=MAXN; long long val[MAXN]; bool flag_zero=false; char tp[100000],*p1=tp,*p2=tp; inline char get_char(){ return p1==p2&&(p2=(p1=tp)+fread(tp,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int read(){ int date=0,w=1;char c=0; while(c<'0'||c>'9'){if(c=='-')w=-1;c=get_char();} while(c>='0'&&c<='9'){date=date*10+c-'0';c=get_char();} return date*w; } void insert(long long x){ for(int i=max_val;~i;i--)if(x&(1LL<<i)){ if(!val[i]){val[i]=x;return;} else x^=val[i]; } flag_zero=true; } bool check(long long x){ for(int i=max_val;~i;i--)if(x&(1LL<<i)){ if(!val[i])return false; else x^=val[i]; } return true; } void work(){ long long x,y; m=read(); while(m--){ x=read();y=read(); if(check(x^y))printf("YES\n"); else printf("NO\n"); } } void init(){ long long x; n=read(); for(int i=1;i<=n;i++){ x=read(); insert(x); } } int main(){ init(); work(); return 0; }