[模板] 线性基

简介

线性基是一个最小的集合 \(S = \{p_i\}, i \in \{ 0, 1, \cdots ,n \}\), \(p_i\) 为二进制数, 它可以通过异或唯一的表示出 \(T = \{a_i\}, i \in \{ 0, 1, \cdots ,m \}\) 中的每一个值. 由于最小性, \(n \le m\).

也就是说, \(S\)\(T\) 在异或意义下张成的空间等价.

为了便于维护和查询, 规定 \(p_i \in S\) 的二进制最高位为第 \(i\) 位, 值为1.

构造

根据定义构造即可.

时间复杂度 \(O(\log v)\), 其中\(v\)为值域大小.

ll lbase[l2sz];
void insert(ll v){
    repdo(i,62,0){
        if((v>>(ll)i)==0)continue;
        if(lbase[i]==0){lbase[i]=v;break;}
        v^=lbase[i];
    }
}

应用

能否表示

类似构造, 如果某次异或后为0则能表示; 否则不能.

求最大异或值

对于每一位, 如果异或之后变大就异或.

正确性显然.

void getmax(ll &a,ll b){if(a<b)a=b;}
ll sol(){
    ll ans=0;
    repdo(i,62,0){
        getmax(ans,ans^lbase[i]);
    }
    return ans;
}

最小异或值

如果能表示出0则为0; 否则, 显然数组中最小非0值为最小异或值.

第k大异或值

//to update

猜你喜欢

转载自www.cnblogs.com/ubospica/p/10391964.html