zoukankan      html  css  js  c++  java
  • 牛客练习赛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<<

  • 相关阅读:
    给Windows组件添加图标
    C#文件和文件夹操作
    WinForm TreeView 右键菜单
    VC++ New 操作符
    Ext与Jquery的整合
    PowerDesign报表操作
    SQLServer自动建表存储过程
    Visual Studio 2008简体中文正式版下载地址
    WinForm遍历控件
    发布时用直接用源文件部署
  • 原文地址:https://www.cnblogs.com/wsblm/p/9643147.html
Copyright © 2011-2022 走看看