线性基学习笔记

源自 link

定义

异或和

设 S 为一无符号整数集,定义异或和 ( m xor-sum(S)=S_1 m xor S_2 m xor dots S_{|S|})

张成

(T subseteq S),所有这样的自己 (T) 的异或和组成的集合称为 (S) 的张成,记作 (span(S))

线性相关

对于一个集合 (S),如果存在一个元素 (S_j),使得,(S) 在去除这个元素后得到的集合 (S') 的张成 (span(S')) 中包含 (S_j),则称 (S) 线性相关。

相对的,如果不存在这样的元素 (S_j),则称 (S) 线性无关

线性基

我们称 (B) 是集合 (S) 的线性基,当且仅当:

  1. (S) (subseteq) ( m span(S))

  2. (B) 线性无关

线性基的个数称为长度

线性基的基本性质:

  1. (B) 是极小的满足线性基性质的集合,它的任何真子集都不可能是线性基
  2. (S) 中任意元素都可以唯一表示为 (B) 中若干元素异或起来的结果

构造

设集合 S 中最大的数在二进制意义下有 L 位,使用一个 ([0..L]) 的数组 (a) 来存储线性基。

这种构造保证了一个特殊性质,对于每个 (i)(a_i) 以下两种可能:

  1. (a_i=0),并且
    (circ) 只有满足 (j>i)(a_j) 的第 (i) 个二进制位可能为 (1)
  2. (a_i eq 0),并且
    (circ) 整个 (a) 数组中只有 (a_i) 的第 (i) 个二进制位为 (1)
    (circ) (a_i) 更高的二进制位一定为 (0)
    (circ) (a_i) 更低的二进制位可能位 (1)

我们称第 i 位存在于线性基中,当且仅当 (a_i eq 0)

证明

显然特殊性质成立。

首先将 (S) 中的数插入到集合 (B) 中。对于一个 t 若它被消成 (0) 则说明可以被线性基表示,若插入到 (B) 中,考虑在之前已经做了若干次异或变换,而这些变换都是可逆的,所以用 (a) 中元素可以表示插入的元素。

单次插入 (O(log t)),空间同样为 (O(log t))

合并

两个线性基在 (O(log^2 t)) 时间内合并,意义是用一个合并后的线性基表示 (S_1)(S_2)

暴力插入就完事了

题目

毛毛虫(没权限也看不了

看到集合中取数做异或立刻想到线性基,显然有一个 (O(n^2log V)) 的做法……

转化一下看看能不能树上启发式合并,似乎不太行,但是考虑到自身到根的一条道路不存在,可以联想到出栈序,随即想到拍到序列上维护。

然后就得到一个 (O(nlog^2V)) 的做法,拍到序列上,然后暴力合并两个线性基。

考虑这个线性基具有饱和性,即插入 (O(log V)) 就不能继续相里插入元素。

所以可以只合并这 (O(log V)) 个线性基。

复杂度做到 (O(nlog V + log^4V))

代码

说一点自己自己对这个东西的理解

考虑这是一个 (log V) 的向量,线性基中的元素相当于基向量,使用基向量来线性组合出某个向量 (x)。特殊地,系数只能为 (0)(1)

原文地址:https://www.cnblogs.com/-Iris-/p/15426100.html