线性基在竞赛中常用来解决子集异或类题目。
如无特殊说明,本文中所述的集合均为无符号整数集。
#前置知识
#异或和
集合 的异或和为 (即 )。
#张成
设 ,所有这样的子集 异或和组成的集合称为 的张成,记为 。即在 中选出任意多个数,其异或和的所有可能的结果组成的集合。
#线性相关与线性无关
对于一个集合 ,如果存在一个元素 使得 在去除这个元素后得到的集合 满足 ,即存在一个元素 可以通过集合中的若干个剩余元素异或得到,则称集合 线性相关。
相对地,如果不存在这样的元素 ,则称集合 线性无关。
#线性基
#定义
我们称集合 是集合 的线性基,当且仅当:
- ;
- 是线性无关的。
集合 中元素的个数称为线性基的 长度。
线性基有以下几个性质:
- 中的任意元素都可以 唯一 表示为 中若干个元素的异或和(对应条件 1);
- 是极小的满足线性基性质的集合,它的任何真子集都不可能是线性基(对应条件 2);
- 中没有异或和为 的子集(对应条件 2);
- 中每个元素的二进制最高位互不相同;
- 在 中选取若干个元素异或起来得到一个元素,用这个元素去替换 中的任意一个元素,得到的新集合 张成的空间不变。
#构造
对集合 的每个数 转为二进制,自高位向低位扫描,若 的第 位为 ,如果 不存在,那么令 并结束扫描,如果存在则令 。
在 Menci 的《线性基学习笔记》中还给出了另一种线性基的构造方法,这种方法将原本的三角基消为了对角基:
设集合 中最大的数在二进制意义下有 位,我们使用一个 的数组 来储存线性基。
- 逆序枚举 所有为 的二进制位 ,对于每个
- 如果 ,则令 ;
- 如果 ,则:
- 枚举 ,如果 的第 位为 ,则令 ;
- 枚举 ,如果 的第 位为 ,则令 ;
- 令 ,结束插入过程。
这种线性基的构造方法保证了一个特殊性质,对于每一个 , 有以下两种可能:
- ,并且:
- 只有 满足 的 (即,位于 后面的所有 )的第 个二进制位 可能 为 。
- ,并且:
- 整个 数组中 只有 的第 个二进制位为 ;
- 更高的二进制位( 的二进制位)一定为 ;
- 更低的二进制位( 的二进制位)可能为 。
#代码
1 |
|
1 |
|
#应用
#检查某个数是否能被表示成集合中若干元素的异或和
首先构造出这个集合的线性基,然后检测这个数是否能被插入到线性基中即可。
1 |
|
#求最大子集异或和
从高位到低位考虑基,若异或后变大,则异或。
由于 都不含 及以上的位,其最大贡献仅为 。有两种情况:
- 若此时 的第 位是 ,则异或上 至少带来 的收益,大于后面可能的所有收益。同时,
(ans ^ a[i]) > ans
也必然成立。 - 若此时 的第 位是 ,至少在这一位有 的亏损,大于后面的位可能的所有收益。同时,
(ans ^ a[i]) > ans
也必不成立。
1 |
|
这种做法由于将三角基消为了对角基,所以第二种情况不会出现。
1 |
|
#合并线性基
暴力插入即可。
1 |
|
#第 k 小子集异或和
先将按照上文中的「方法 2」建立对角线性基。
将 二进制拆分,每一位的 / 对应异或时选 / 不选线性基存在的这一位。
证明:线性基中存在的位的 / 唯一确定了一个异或出的数,由于每个位只在一个基中为 ,这些位组成的二进制数的大小就可以代表异或出的数的大小。
预处理出线性基中所有存在的位:
1 |
|
对于每次询问 :
1 |
|