异或空间线性基

由于实数线性基太抽象,所以这里就写异或空间线性基。

给定 \(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\)

posted @ 2024-03-17 01:42  BYR_KKK  阅读(16)  评论(0编辑  收藏  举报