线性基

定义

张成

一个集合 ss 的所有非空子集的异或和所组成的集合为 ss 的张成,记作 span(s)\operatorname{span}(s)

线性相关 & 线性无关

如果一个集合 ss 存在一个元素 xx 使得 ss 去掉 xx 之后形成的集合 ss' 满足 xspan(s)x \in \operatorname{span}(s'),则称 ss 线性相关。

其实就是 ss 存在一个元素可以由其它几个元素异或得到,而且从这可以知道,去掉一个线性相关的集合 ss 里像 xx 一样的元素后,ss 的张成不变。

反之,则称集合 ss 线性无关。

线性基

我们称 ttss 的线性基,当且仅当:

  • sspan(t)s \subseteq \operatorname{span}(t)
  • tt 线性无关。

性质

ss 的线性基 tt 有两个基本性质:

  • tt 不存在一个真子集 uu 使得 uuss 的线性基。

    因为 tt 线性无关,所以无法去掉 tt 的任意元素使得 tt 的张成不变。

  • ss 的每个元素都可以被唯一表示为 tt 的若干元素的异或和。

    首先因为 sspan(t)s \subseteq \operatorname{span}(t),所以 ss 的每个元素都可以被表示为 tt 的若干元素的异或和。

    接下来使用反证法证明这个表示是唯一的。

    假设 ss 中一个元素 xx 等于 tt 的子集 uu 的异或和,也等于子集 vv 的异或和,且 uuvv 没有交集。(uuvv 的公共部分是没有意义的)

    然后 uu 中的一个元素 yy 可以被自己异或得到,也可以被 uu 里的剩余元素和 vv 的所有元素异或而成,这不满足 tt 的线性无关性。

构造

我们使用一个数组 bb 存储线性基,当 bi0b_i \ne 0 时我们称第 ii 位存在。

这样构造出来的线性基有一个有用的限制:每个元素最高位互不相同。

我们考虑将数一个一个插入线性基。

根据线性基的性质,nn 个元素中,只要有一个元素第 ii 位为 11,第 ii 位就存在。所以如果数据随机,线性基的大小就比较大,这个性质有时候会应用。

插入过程

设插入的数为 xx,考虑从高位考虑到低位,假设现在考虑到第 ii 位。

  • 如果 xx 的第 ii 位为 00,直接进入下一位的考虑即可。
  • 否则:
    • 如果第 ii 位存在,我们需要将 xx 的第 ii 位消除,(因为只有 bib_i 的第 ii 位为 11)把 xx 异或上 bib_i 即可。
    • 如果第 ii 位不存在,我们将 xx 插入 bb

如果 xx 自始至终都没有被插入,那就说明 xx 可以被线性基里的一些数异或出来,如果插入就不满足线性无关性。

证明

因为我们对 xx 以及 bb 的操作都是互相异或,这些操作显然是可逆的,所以用 bb 的一些元素的异或和可以表示出原本的 xx

代码

void insert(ll x){
	for (int i = 49;i >= 0;i --){
		if (x >> i & 1 ^ 1) continue;
		if (b[i]) x ^= b[i]; // 用 b[i] 消去 x 的第 i 位
		else { // 可以插入
			b[i] = x; // 插入
			break; // 一定不要忘记
		}
	}
    // 如果没被插入(即 x 被异或成 0)就说明不需要 x
}

应用

子集最大异或和

令答案为 ansans,初始为 00,然后我们考虑倒序枚举位 ii,如果 ansbi>ansans \oplus b_i > ans,就令 ansans 等于 ansbians \oplus b_i,因为根据特殊性质,以后就没有改变 ansans 的第 ii 位的机会。

子集最小异或和

根据根据特殊性质,答案为 bib_i 的最小值。

子集 kk 小异或和

如果数全都被插进线性基,选出线性基的一个非空子集有 2s12^{|s|} - 1 种方案。

否则,有异或和为 00 的情况,一共有 2s2^{|s|} 种方案,如果 kk11,输出 00 即可,否则令 kk11(去掉异或和为 00 的情况)。

令答案为 ansans,初始为 00,然后我们考虑 kk 的每一个二进制位,假设考虑到第 ii 位:

  • x=min(ans,ansbi),y=max(ans,ansbi)x = \min(ans, ans \oplus b_i), y = \max(ans, ans \oplus b_i)

  • 如果该位为 11,那么令 ansansyy

  • 否则令 ansansxx