zoukankan      html  css  js  c++  java
  • 线性基

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

  • 相关阅读:
    ASP.NET 学习笔记(一)ASP.NET 概览
    JSP基础
    算法
    TestNG基础教程
    TestNG基础教程
    TestNG基础教程
    Jira
    Jira
    Jira
    Jira
  • 原文地址:https://www.cnblogs.com/zhongzero/p/11788624.html
Copyright © 2011-2022 走看看