线性基
简介
线性基一般指的是异或线性基。它满足如下这些性质:
-
原序列中的任何一个数都可以线性基中的一些数异或得到。
-
线性基没有异或和为 \(0\) 的子集。
-
线性基是保证前两个性质的基础上数的个数最少的一个。
其实就是在数域 \(\mathbb{F}_2\) 下用位运算维护 \(\mathbb{F}^n_2\) 的子空间的基。
基础线性基
基础的线性基需要支持:
-
加入一个元素,维护一组基,这组基要满足任意两个元素的最高位都不相同。
从高位到低位消元即可。 -
询问一个数与已经加入的元素的异或最大值。
从高位到低位贪心,如果当前数的第 \(i\) 位为 \(0\),且极大无关组中有一个元素最高位为 \(i\),那么把当前数异或上这个元素即可。
线性基求并/交
设两个线性基为 \(A,B\)。
-
线性基求并:把一个线性基的基里的所有元素依次插入另一个基即可。
-
线性基求交:保留所有 \(B\) 的基中能被 \(A\) 中元素表示的元素即可。
带删除线性基
离线算法
对基中的每个元素维护其删除时间,由多个元素异或组合而成的元素的删除时间为这些元素删除时间的最小值。
插入时,贪心地,让基中的高位元素的删除时间尽量晚。还是从高位到低位枚举,枚举到第 \(i\) 位时,如果当前插入元素的删除时间晚于基中第 \(i\) 位元素的删除时间,那么二者交换。其余部分与普通线性基相同。
查询时只考虑那些删除时间晚于当前时间的基元素即可。
在线算法
-
如果被删除元素不是基中元素,直接删除即可,没有影响。
-
如果被删除元素是基中元素,那么需要消除它的影响。对每个基中元素 \(x\) 维护需要用 \(x\) 来表示的非基元素集合 \(S_x\),用 \(S_x\) 中的任意一个元素来代替 \(x\) 即可。
例题
- 幸运数字
给出一棵 \(n\) 个点的树,点有点权 \(G_i\)。\(q\) 次询问,每次给出 \(x,y\),在树上 \(x\) 到 \(y\) 路径中选出一些节点,最大化这些节点点权异或和的最大值。
sol:
使用倍增预处理的思想,令 \(f_{u,i}\) 表示节点 \(u\) 的 \(2^i\) 级祖先到自己的所有节点的点权构成的线性基。
合并线性基的复杂度是 \(O(\log^2 G)\) 的,于是预处理复杂度 \(O(n\log n\log^2 G)\)。
用倍增 LCA 的方式,每次询问需要进行 \(O(\log n)\) 次线性基合并,总复杂度 \(O((n+q)\log n\log^2 G)\),无法通过。
线性基求并具有可重复贡献性,于是每次询问可以不用倍增跳,而是可以采用 RMQ 的思想,选取一个前缀与一个后缀合并即可。
总复杂度 \(O(n\log n\log^2 G+q\log^2 G)\)。

浙公网安备 33010602011771号