线性基模板

线性基模板

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

可以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 @   Showball  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示