NC17968. xor序列
描述
输入描述
第一行为一个整数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
说明:
对于(6,7)来说,6可以先和3异或,再和2异或C++(g++ 7.5.0) 解法, 执行用时: 98ms, 内存消耗: 952K, 提交时间: 2023-05-01 18:17:12
#include<iostream> #define ll long long using namespace std; ll d[64]; int add(ll x,ll p){ for(int i=62;i>=0;i--)if(x>>i&1){ if(d[i])x^=d[i]; else return d[i]=p?x:0,1; }return 0; } int main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int n;cin>>n; for(int i=1;i<=n;i++){ ll x;cin>>x; add(x,1); }cin>>n;while(n--){ ll x,y;cin>>x>>y; puts(add(y^x,0)?"NO":"YES"); } }
C++14(g++5.4) 解法, 执行用时: 182ms, 内存消耗: 4576K, 提交时间: 2019-02-20 11:03:08
#include<stdio.h> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) int n,v[40],x,y; int main(){ scanf("%d",&n); fo(j,1,n){ scanf("%d",&x); fd(i,30,0) if (x&(1<<i)){ if (v[i]) x^=v[i];else{ v[i]=x; break; } } } scanf("%d",&n); while (n--){ scanf("%d%d",&x,&y); x^=y; fd(i,30,0) if (x&(1<<i)){ if (v[i]) x^=v[i]; } if (x) printf("NO\n");else printf("YES\n"); } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 540ms, 内存消耗: 4712K, 提交时间: 2019-07-17 21:19:32
#include<bits/stdc++.h> using namespace std; int n,q,x,y,z; int d[100005]; int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>z; for(int j=30;j>=0;j--){ if(z>>j){ if(!d[j]){ d[j]=z; break; } z^=d[j]; } } } cin>>q; while(q--){ cin>>x>>y; x^=y; for(int i=30;i>=0;i--){ if(x>>i){ x^=d[i]; } } if(x){ puts("NO"); }else puts("YES"); } return 0; }