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

版权声明:是自己手打的没错 https://blog.csdn.net/Mr_Treeeee/article/details/82559654

https://www.nowcoder.com/acm/contest/180/D

point:

线性基的基础题,

什么是线性基:简单的说, 给你n个数,他们异或起来可以得到很多数,称为一个集合。

那么这个线性基,他们异或起来也等于这个集合。且这个线性基最多只有log2(Max)个。Max为这n个数的最大值。

线性基P[i]存的数,最高位的1(二进制)就在第i位。

那么有特色的线性基,里要找能不能构造出x ^y这个数,也就是题目所要求的目标。

直接从最高位开始往下搜,如果存在1,并且存在p[i],那么让他们异或一下,这个1就消失了。

然后一直这样下去,看看能不能变为0,0则说明可以构造出来。

扫描二维码关注公众号,回复: 3352882 查看本文章
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
const int N = 1e5+55;
 
LL p[60];
 
void f(LL x)
{
    for(int i=60;i>=0;i--){
        if((x>>i)&1){
            if(!p[i]) {
                p[i]=x;
                break;
            }
            else x=x^p[i];
        }
    }
}
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        LL x;
        scanf("%lld",&x);
        f(x);
    }
    int m;
    scanf("%d",&m);
    while(m--){
        LL x,y;
        scanf("%lld%lld",&x,&y);
        x=x^y;
        for(int i=60;i>=0;i--){
            if((x>>i)&1){
                if(!p[i]) break;
                x=x^p[i];
            }
        }
        if(x==0) printf("YES\n");
        else{
            printf("NO\n");
        }
    }
 
    return 0;
 
}

猜你喜欢

转载自blog.csdn.net/Mr_Treeeee/article/details/82559654
今日推荐