链接:https://ac.nowcoder.com/acm/contest/180/D

来源:牛客网

xor序列

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 262144K,其他语言524288K

64bit IO Format: %lld

题目描述

小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

备注:

对于100%的数据,n,Q<=105

保证所有运算均在int范围内

题意:



思路:

异或的性质:

y^y=0 则 xyy=x

令 x^z=y 两边异或x , 则 xzx=y^x -> z= y^x

即在数组中 找出一些数异或起来等于z即可。

这恰好是线性基的基础功能。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/ struct LB {
// 注意最高是60还是62
ll d[61], p[61];
int cnt, mx;
LB() {
memset(d, 0, sizeof(d));
memset(p, 0, sizeof(p));
cnt = 0, mx = 61;
}
void init() {
memset(d, 0, sizeof(d));
memset(p, 0, sizeof(p));
}
bool add(ll val) {
/*插入时判断之前是否有数会与val异或得0,判第k小时如果有为0的情况,k要减一*/
for (int i = mx - 1; i >= 0; i--) {
if (val & (1LL << i)) {
if (!d[i]) {
d[i] = val; break;
}
val ^= d[i];
}
}
return val > 0;
}
bool query(ll val) { // 查询val这个数是否存在
for (int i = mx - 1; i >= 0; i--) {
if (val & (1LL << i)) {
if (!d[i]) return 0;
val ^= d[i];
}
}
return 1;
}
ll query_max(ll val) {
ll ret = val;
for (int i = mx - 1; i >= 0; i--) if ((ret ^ d[i]) > ret) ret ^= d[i];
return ret;
}
ll query_min() {
for (int i = 0; i < mx; i++) if (d[i]) return d[i];
return 0;
}
void rebuild() {//消元,保存到p数组
cnt = 0;
for (int i = 0; i < mx; i++) {
for (int j = 0; j < i; j ++ )
if (d[i] & (1LL << j)) d[i] ^= d[j];
}
for (int i = 0; i < mx; i++) if (d[i]) p[cnt++] = d[i];
}
ll query_kth(ll k) { //使用前需要rebuild
ll ret = 0;
if (k >= (1LL << cnt)) return -1;
for (int i = cnt - 1; i >= 0; i--) if (k & (1LL << i)) ret ^= p[i];
return ret;
}
ll find(ll x) { //找x是第几大的数,需保证x一定在
ll ret = 0, c = 0;
for (int i = 0; i < mx; i++) {
if (d[i]) {
if (x >> i & 1) ret += (1LL << c);
c++;
}
}
return ret;
}
LB operator+(const LB & _A)const { //合并
LB ret = *this;
for (int i = mx - 1; i >= 0; i--) if (_A.d[i]) ret.add(_A.d[i]);
return ret;
}
};
LB base=LB(); int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout); int q;
int n,x;
cin>>n;
repd(i,1,n)
{
cin>>x;
base.add(x);
}
cin>>q;
int y;
while(q--)
{
cin>>x>>y;
x^=y;
if(base.query(x))
{
cout<<"YES"<<endl;
}else
{
cout<<"NO"<<endl;
}
} return 0;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

最新文章

  1. The Engine Document of JustWeEngine
  2. 【原创】Windows Server 文件夹权限小问题
  3. 织梦DedeCMS删除所有栏目或文章后,新建ID不从1开始的解决方法
  4. Unity3D入门(一):环境搭建
  5. Threads Events QObjects
  6. 批量还原数据库 SQL Server 2008
  7. oracle 将科学计数法数据转换为非科学计数法数据
  8. CocoaPods使用详细说明(转)
  9. CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序
  10. PHP去除Notice警告提示
  11. InstallShield安装包卸载-完美卸载
  12. 让Flash支持Stage3D
  13. Web设计新手应知道的10个锦囊妙计
  14. 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?
  15. 伯克利SocketAPI(一) socket的C语言接口/最简单的服务器和对应的客户端C语言实现
  16. constexpr和常量表达式
  17. appium+java(五)微信小程序自动化测试实践
  18. 蓝牙协议分析(4)_IPv6 Over BLE介绍
  19. gearman中任务的优先级和返回状态
  20. logrotate 日志切割工具

热门文章

  1. [MVC HtmlHelper简单了解]
  2. linux系统导入证书
  3. Prometheus存储模型分析
  4. 【HANA系列】SAP HANA的ini文件存储路径
  5. 项目连接oracle报错:listener does not currently know of SID given in connect descriptor
  6. javascript 数据类型之数值转换
  7. 2019JAVA第八次实验报告
  8. ELK的搭建以及使用
  9. 移动端 h5 适配之必知必会
  10. 什么是 MicroPython ?它有什么优势?