牛客练习赛26—D xor序列 —线性基

  这是我第一次写关于线性基的题目。其实这题很好理解,先把给出的数能异或出的值给存在p数组里面,p[i]代表着该异或出的数的最高位为第i位且为1. 求出来后,再把x,y处理下,然后直接一位一位的判断是否为1,如果为1,就找到表中该位为最高位且为1的数来和它异或(这样因为两个数前面都是0可以不用考虑前面数的影响),异或到最后,如果剩下的为0,则可以异或出答案,反之亦然。

  在写的时候,不管怎么调都发现是输出no,找了半天,才发现定义的x,y都是int型   导致在向左移动的时候溢出范围,然后出错QAQ。 真是菜的真实

#include<iostream>
using namespace std;
long long p[70]={0};
void f(long long k)
{
    for(int i=60;i>=0;i--)
    {
        if((k>>i)&1)
        {
            if(!p[i])
            {
                p[i]=k;
                break;
            }
            else k=k^p[i];
        }
    }
}
int main()
{
    long long x,y,i,j,k,l,ans,n,m;
    cin>>n;
    for(j=0;j<n;j++)
    {
        cin>>k;
        f(k);
    }
    cin>>m;
    while(m--)
    {
        cin>>x>>y;
        ans=x^y;
        //cout<<ans<<endl;
        for(int i=60;i>=0;i--)
        {
            if((ans>>i)&1)
            {
                //cout<<"11111"<<endl;
                if(p[i]==0) 
                {
                    //cout<<"222"<<endl;
                    //cout<<p[i]<<endl;
                //    cout<<i<<endl; 
                    break;
                }
                else ans=ans^p[i];//,cout<<"333"<<endl;
            }
        }
        if(ans==0) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
        //cout<<ans<<endl;
        //for(int i=9;i>=0;i--) cout<<p[i]<<endl;
    }
}

参考博客>>https://blog.csdn.net/Mr_Treeeee/article/details/82559654<<

猜你喜欢

转载自www.cnblogs.com/wsblm/p/9643147.html
今日推荐