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