【算法简介】
线性基是向量空间的一组基,通常可以解决有关异或的一些题目。
通俗一点的讲法就是由一个集合构造出来的另一个集合,它有以下几个性质:
-
线性基的元素能相互异或得到原集合的元素的所有相互异或得到的值。
-
线性基是满足性质 1 的最小的集合。
-
线性基没有异或和为 0 的子集。
-
线性基中每个元素的异或方案唯一,也就是说,线性基中不同的异或组合异或出的数都是不一样的。
-
线性基中每个元素的二进制最高位互不相同。
【构造方法】
采取增量构造的方式,把一个新加入原集合的数转换成二进制
从高位开始,如果当前位为1,如果线性基的第i位上没有数,那就赋成当前值x
如果有值,就把x^=p[i]即可
【用途】
线性基的题型相对比较固定,看到下面的类型基本上都是线性基了:
- 最大异或和
- 第 k 大异或和/异或和是第几大
- 求所有异或值的和
线性基中的题目中还用到一个技巧:
- 任意一条 1 到 n 的路径的异或和,都可以由任意一条 1 到 n 路径的异或和与图中的一些环的异或和来组合得到。
线性基性质
【例题1】P3857 [TJOI2008]彩灯
【习题1】P4570 [BJWC2011]元素
判断一个值能否被异或出来,我们就需要把这个数向线性基插入,如果能插入说明没有,反之说明存在
最大异或和
【习题2】P4151 [WC2011]最大XOR和路径
最小异或和
最小异或和显然是线性基中最小的那一个
第k小异或值
【例题3】HDU3949 XOR
带删除线性基
首先插入和删除不在线性基内的值很好实现
重点是如何处理删除那些在线性基中的值
每次维护一下一个值是由哪些线性基中哪些值异或得到的