题目链接:线性基模板
struct basis{
ll d[70],newd[70];
int flag,tot;
void init(){
tot=0;
flag=0;
memset(d,0,sizeof(d));
memset(newd,0,sizeof(newd));
}
void ins(ll x){
for(int i = 62; i >= 0; i--){
if(x&(1ll<<i)){
if(!d[i]){
d[i]=x;
return;
}else x^=d[i];
}
}
flag=1;
}
void rebuild(){
for(int i = 0; i <= 62; i++)
for(int j = 0; j < i; j++)
if(d[i]&(1ll<<j)) d[i]^=d[j];
for(int i = 0; i <= 62; i++)
if(d[i]) newd[tot++]=d[i];
}
ll getmx(){
ll ans = 0;
for(int i = 62; i >= 0; i--)
if((ans^d[i])>ans) ans^=d[i];
return ans;
}
ll getmi(){//序列能得到的异或最小值
if(flag) return 0;
for(int i = 0; i <= 62; i++)
if(d[i]) return d[i];
return 0;
}
ll kth(ll k){//第k小
if(flag) k--;
if(k==0) return 0;
if(k>=(1ll<<tot)) return -1;
ll ans = 0;
for(int i = 0; i <= 62; i++)
if(k&(1ll<<i)) ans^=newd[i];
return ans;
}
}p;