大佬
#include#define re return#define ll long long#define dec(i,l,r) for(ll i=l;i>=r;--i)#define inc(i,l,r) for(ll i=l;i<=r;++i) using namespace std;template inline void rd(T&x){ char c;bool f=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x;}ll n,p[70];inline void insert(ll x){ //不断插入一个数 //如果他不能被当前数表示出来 //就在不能表示的最低位插入 dec(i,62,0) //为了不爆long long最好在63以内 if((x>>((ll)i))) { if(!p[i]) { p[i]=x; re ; } x^=p[i]; } re;}int main(){ //这题开long long 最好所有变量包括循环都开 freopen("in.txt","r",stdin); rd(n); ll x; inc(i,1,n) { rd(x); insert(x); } ll sum=0; dec(i,62,0) if((sum^p[i])>sum) //从高到底插入 sum^=p[i]; printf("%lld",sum); re 0;}
查询第K小
#include#define re return#define dec(i,l,r) for(ll i=l;i>=r;--i)#define inc(i,l,r) for(ll i=l;i<=r;++i)using namespace std;template inline void rd(T&x){ char c;bool f=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x;}#define ll long longll n,Q,p[64],cnt,ans[65];inline void insert(ll x){ dec(i,63,0) if(x>>i) { if(!p[i]) { p[i]=x; re ; } x^=p[i]; } re ;}inline void Gauss(){ dec(i,63,0) if(p[i]) { inc(j,i+1,63) if((p[j]>>(j-i))&1) p[j]^=p[i]; } //高斯消元??? //将基向量弄成互不影响的那种 memset(ans,0,sizeof ans); inc(i,0,63) if(p[i]) ans[cnt++]=p[i];}int main(){ ll x,T,n,tot; rd(T); while(T--) { printf("Case #%d:\n",++tot); rd(n); cnt=0; memset(p,0,sizeof p); inc(i,1,n) { rd(x); insert(x); } Gauss(); rd(Q); inc(i,1,Q) { rd(x); if(n!=cnt)x--;//异或后可能会有0的存在 if(x>=(1ll< >j)&1) sum^=ans[j]; printf("%lld\n",sum); } } } re 0;}