线性基
Posted zhongzero
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性基相关的知识,希望对你有一定的参考价值。
uoj 91 最大异或和
要求:维护一个线性基,每次加入一个元素,替换掉最先加入的一个与它 线性相关的 仍然存在的 元素。
考虑现在的线性基中元素为(b_i),每次加入的元素为(a_i)
(b_1) ((b_1=a_{k1} xor a_{k2} xor a_{k3}....))
(b_2) ((b_2=a_{h1} xor a_{h2} xor a_{h3}....))
(b_3) ((b_1=a_{g1} xor a_{g2} xor a_{g3}....))
.
.
.
我们考虑形式化要求:即每次加入一个(x) :
1.若x与当前线性基中元素线性无关,直接加入即可;
2.否则,找到 (x xor a_{k1} xor a_{k2} xor a_{k3}....=0) ,将出现时间最靠前的(a_k)替换掉
定义
每一个(b_i)可以由许多(a_k)异或表示,我们定义$ id_i(为组成)b_i(的)a_k$中出现时间最小的时间
维护
我们现在维护一个线性基,满足对于线性基中每一个元素(i),(id_i)都不同。
每一次我们将所有的 (x xor b_{k1} xor b_{k2} xor b_{k3}....=0),找出来
从高位到低位逐位替换,则时间最靠前的(a_k)一定是最小的(id_k) ,我们只要将(b_k)中(id_k)最小的替换掉就行了。
我们考虑当前位为(b_i) ,如果我们要加入x,可以:
1.将(x xor b_i) 向下递归;
2.将(b_i)替换成(x)((id_i)也替换) ,将(x xor b_i) 向下递归;
如果进行1操作,向下递归的(x xor b_i) 的(id)值将会改成(id_i) ,可我们要求每个(b_i)的(id)值不同,所以1操作不符合要求。
考虑进行2操作,向下递归的(x xor b_i) 的(id)值将会改成(id_i) ,而原(b_i)上的数也(x)替换((id_i)也被替换),符合要求。
总结一下(代码实现)
每一次加入元素(x) (x的(id) 定义为(id_x)),找到当前最高位的与(x)有关的(b_i) :
1.若(id_x<id_i) ,将$x xor b_i $向下递归。
2.若(id_x>id_i) ,将(b_i)替换成(x)((id_i)也替换为(id_x)) ,将$x xor b_i (()id_x$为原来的 (id_i) )向下递归。
直到找到一个空位置,将(x)插入,等同于插入操作;或(x)异或成0,相当于替换操作
以上是关于线性基的主要内容,如果未能解决你的问题,请参考以下文章