线性基求交
struct lb{
ll p[63];
lb(){
memset(p,0,sizeof(p));
}
void clear(){
memset(p,0,sizeof(p));
}
void ins(ll x){
for(int i=60;i>=0;i--) if((x>>i)&1){
if(!p[i]){
p[i]=x;
return;
}else x^=p[i];
}
}
};
lb merge(lb a,lb b){
lb g=lb(),tmp=a;
ll cur,d;
for(int i=0;i<=60;i++) if(b.p[i]){
cur=0,d=b.p[i];
for(int j=i;j>=0;j--) if(d>>j&1){
if(tmp.p[j]){
d^=tmp.p[j],cur^=a.p[j];
if(d) continue;
g.p[i]=cur;
}else tmp.p[j]=d,a.p[j]=cur;
break;
}
}
return g;
}