列表

详情


NC17968. xor序列

描述

小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

说明:

对于(6,7)来说,6可以先和3异或,再和2异或
对于(2,1)来说,2可以和3异或
对于(3,8)来说,3不论如何都不能变换为8

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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;
}

上一题