牛客练习赛26 D-xor序列(线性基)

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

我们坚持一件事情,并不是因为这样做了会有效果,而是坚信,这样做是对的。——哈维尔

*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值