线性基

概念:

对于若干个$m$位的二进制数$a_1,a_2,……,a_n$,它们任意组合异或出的结果全部可以用不超过$m$个数$b_1,b_2,……,b_n$异或出来

且$b_i$的最高位是第$i$位,则$b$称为$a$的线性基

构造:

每向a中加入一个元素$x$时,从高到低扫描$x$的每一位

扫描到第$i$位时,如果第$i$位为0就跳过

如果为1,若$b_i$不存在,就把$b_i$赋成$x$并退出,否则让$x\hat{} =b_i$以保证$x$的最高位小于$i$

void insert(long long x){
    for(int i=62;~i;i--){
        if(x&(1ll<<i)){
            if(!a[i]){a[i]=x;return;}
            x^=a[i];
        }
    }
}

查询异或最大值:

把ans赋成0,从高往低扫$b_i$

若$ans\hat{} b>ans$,则$ans\hat{} =b_i$

long long Max(){
    long long ans=0;
    for(int i=62;~i;i--){
        ans^=(ans&(1ll<0:a[i];//如果ans第i位不为1就ans^=a[i]
    }
    return ans;
}

结构体

#define LL long long
struct Base{
    LL a[63];
    void insert(LL x){
        for(int i=62;~i;i--){
            if(x&(1ll<<i)){
                if(!a[i]){a[i]=x;return;}
                x^=a[i];
            }
        }
    }
    LL Max(){
        LL ans=0;
        for(int i=62;~i;i--){
            ans^=(ans&(1ll<0:a[i];
        }
        return ans;
    }
};

 

你可能感兴趣的:(线性基)