线性基求交

引理:有两个线性基 A,BA,B , 设 BB 中能被 AA 表示的集合为 WW,且 (BW)A(B\setminus W)\cup A 线性无关,则 WWA,BA,B 所表示张成的空间的交的一组基。

证明:显然 WW 里的每一个元素都既能被 AA 也能被 BB 表示,而如果一个既能被 AA,也能被 BB 表示的元素 vv 无法被 WW 表示,设它在被 BB 表示时用到 WW 内的元素为 SSBWB \setminus W 内的元素为 TT,(TT \neq \emptyset),SSWW 的子集,能被 AA 表示,STS \cup T 能被 AA 表示,于是 TT 能被 AA 表示,与假设矛盾。

于是我们只需要将任意一组 BB 转为符合上述条件的一组基。

我们维护一个初始为 A 的线性基(实际上是 (BW)A(B\setminus W)\cup A ),我们依次枚举每一个 BiB_i,判断它能否被这个线性基所表示,如果不能,将它插入,这代表这个元素最后属于 BWB\setminus W,如果能,设表示它所用的 AA 中的元素集合为 SiS_iBB 中的元素集合为 TiT_i,将 SiS_i 加入 WW 中。

实际上我们就是将加入 WWBiB_i 变为 SiS_i,没有加入 WWBiB_i 保证不变。

首先这样 BB 张成的空间一定不变,因为表示每一个改变了的 BiB_iTiT_i 所用的元素都未加入 WW,仍在基中(即新的基仍能表示出 BiB_i,旧的基本来就是表示出 SiS_i)。

容易发现这样做我们加入 WW 的元素一定能被 AA 表示,没有加入 WW 的元素一定不能被 AA 表示(因为它没法被一个完全包含 AA 的线性基表示),而我们每次往 BWB\setminus W 加入元素都保证了它无法被现有的 (BW)A(B\setminus W)\cup A 所表示,于是最后得到的 WW 一定合法。

实现上就是在线性基每一位记录一个 f[i] 表示这一位来自 AA 还是 BB,插入 BB 的一个元素时直接记录所有它异或上的,为 AA 内的元素的异或和,如果插入失败的话更新 WW 即可(其实如果我们从小往大插入,插入 BiB_i 失败的话 SiS_i 的最高位和 BiB_i 的最高位一定相同。因为我们没有插入任何一个最高位大于等于 BiB_iBjB_j,于是可以直接在 BB 上改代表 WW