码迷,mamicode.com
首页 > 其他好文 > 详细

[模板] 线性基

时间:2019-02-17 17:53:50      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:维护   模板   date   turn   时间复杂度   insert   空间   最大   inline   

简介

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

[模板] 线性基

标签:维护   模板   date   turn   时间复杂度   insert   空间   最大   inline   

原文地址:https://www.cnblogs.com/ubospica/p/10391964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!