線性基模板

Showball發表於2024-05-09

線性基模板

線性基是一種擅長處理異或問題的資料結構

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

相關文章