这是我第一次写关于线性基的题目。其实这题很好理解,先把给出的数能异或出的值给存在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<<