异或空间线性基
由于实数线性基太抽象,所以这里就写异或空间线性基。
给定 \(a_1,a_2,\cdots\),设其中若干个数异或得到的集合为 \(s\),要求解 \(p_1,p_2,\cdots,p_m\),使其满足:
-
其中若干个 \(p\) 异或得到的集合等于 \(s-{0}\)。
-
\(m\) 最小。
构造
令 \(p_i\) 代表二进制最高位为 \(i\) 的数。
对于一个数,设其最高位为 \(j\):
-
若 \(p_j\) 不存在,则让 \(p_j\) 等于这个数。
-
否则若这个数不为 0,让这个数异或上 \(p_j\),重新插入。
证明
考虑原序列的一个异或结果 \(a_{x1}\oplus a_{x_2}\oplus\cdots\oplus a_{xk}\) 能否用线性基表达。
根据构造可以发现 \(a_i\) 可以被线性基表达。
于是对于 \(a_{xi}\),将其用线性基表达,根据 \(q\oplus q=0\),化简异或式子。
容易发现此时线性基可以表达。
考虑一个非原序列的异或结果 \(a_{x1}\oplus a_{x2}\oplus\cdots\oplus a_{xk}\oplus y\),其中 \(y\) 不可被原序列表达。
类比证明,\(y\) 一定不可以被线性基表达。
充分性和必要性兼具。
复杂度分析
根据构造,线性基中的元素个数为 \(\log\)。
推理的得到时间复杂度为 \(O(n\log n)\)。
高斯消元
主要用于帮助理解线性基。
把 \(a_i\) 看作二进制,写成 \(n\times m\) 的 0/1 矩阵。
用高斯消元求解异或方程组,具体见《算法竞赛》第 405 页。
一些操作
求最值
最小值
线性基中的最小值。
考虑反证。设存在一个数更小,由于线性基中任意两个数二进制最高位不同,易证不存在这样的数。
最大值
从高位向低位贪心。
第 k 小
考虑将所有 \(p_i\) 变为 \(2^i\) 或 \(0\) 的形式,这显然是可以做到的。
然后对 \(k\) 二进制拆分后乱搞,注意特判 \(0\)。