线性基模板
线性基模板
线性基是一种擅长处理异或问题的数据结构
可以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;
}