[模板] 线性基

Posted ubospica

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板] 线性基相关的知识,希望对你有一定的参考价值。

简介

线性基是一个最小的集合 (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

以上是关于[模板] 线性基的主要内容,如果未能解决你的问题,请参考以下文章

P3812 模板线性基

LG3812 「模板」线性基 线性基

[模板]线性基

线性基(模板)

线性基总结(其实就是我的模板)

[P3812][模板]线性基