重修 线性基


Luogu 例题

Someone's Blog

概念

(自己总结的)

大小 \(\log n\) 的数组来表述一个大小为 \(n\) 的原数组的异或问题的数据结构。

本质

多维向量的作为基底的特殊形式,可用高斯消元理解。

构造

本构造线性基中每一个数 \(x\) 都对应了原来每一个二进制位,即 \(upperbit(x)\),所以线性基的二进制最高位互不相同。

我们构造 \(\{a\}\) 的线性基 \(\{p\}\)

每次插入一个数 \(x\in\{a\}\),如果 \(\exists y\in\{p\}\ |\ upperbit(x)=upperbit(y)\)(即若 \(y\) 想加入线性基,她所属的二进制位已被占),则 \(x'=x\operatorname{xor} y\),这使得 \(upperbit(x'),递推即可。当然若 \(x\) 最后为 \(0\) 则他与前面的线性基线性有关,废掉 \(x\)

void insert(int x){
    for(int i = 63;i>=0;i--){
        if(x&(1ll<

实战

开头的例题:查询一个数集的任意子集的异或最大值

建立线性基,贪心从高位到低位。

for(long long i=62;i>=0;i--)
    if((p[i]^ans)>ans)
        ans^=p[i];

My Record

AtCoder:给定 \(\{a_1,\dots,a_{2^n-1}\}\),求一组 \(S=\{1,\dots,2^n-1\}\) 的线性基 \(\{p\}\) 使得 \(\sum_{x\in p}a_x\) 最小

链接

贪心:按 \(a_x\)\(S\) 排序,顺序遍历贪心取入答案,具体见代码。

My Record

OI