线性基

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,相当于替换操作

原文地址:https://www.cnblogs.com/zhongzero/p/11788624.html