線性基模板
線性基是一種擅長處理異或問題的資料結構
可以O(logn)求出異或最值和異或k大值
支援插入和判斷一個數
//線性基
LL p[65],d[65],tot=0;
void rebuild(){
for(int i=63;i>=0;i--){
for(int j=i-1;j>=0;j--){
if(p[i]>>j&1) p[i]^=p[j];
}
}
for(int i=0;i<=63;i++) if(p[i]) d[tot++]=p[i];
}
void insert(LL x){
for(int i=63;i>=0;i--){
if(x>>i&1){
if(!p[i]){
p[i]=x;
return;
}
x^=p[i];
}
}
}
bool find(LL x){
for(int i= 63;i>=0;i--){
if(x>>i&1){
if(!p[i]) return false;
x^=p[i];
}
}
return true;
}
LL Maxn() {
LL ret=0;
for(int i=63;i>=0;i--) ret=max(ret,ret^p[i]);
return ret;
}
LL Minn() {
for(int i=0;i<=63;i++){
if(p[i]) return p[i];
}
return 0; // 如果線性基為空,則返回0
}
LL kth(int k){//第k大
if(k>=(1LL<<tot)) return -1;
LL ret=0;
for(int i=62;i>=0;i--){
if(k>>i&1) ret^=d[i];
}
return ret;
}