线性基模板

线性基模板

线性基是一种擅长处理异或问题的数据结构

可以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;
}

posted @ 2024-05-09 02:09  Showball  阅读(6)  评论(0编辑  收藏  举报