zoukankan      html  css  js  c++  java
  • 关于线性基的一些理解

    参考博客:

    https://www.cnblogs.com/ljh2000-jump/p/5869991.html

    线性基的基本性质:原数组的异或值域等于线性基数组的值域

    也就是,原数组能异或出来的值,线性基一样可以得到,如果我们求原数组异或值的性质,我们只需要在$lgn$个数中讨论

    极大地降低了问题的复杂度

    从中推导出的性质:线性基子集的异或和不为零,如果为零,那么肯定有个不应该加入线性基的数被加入。

    插入:

    如果从高到低插入,插入后的基底大概会是这样的

    $$egin{bmatrix}1***\ 01**\ 001*\ 0001\ end{bmatrix}$$

    bool insert(int x)//插入x
    {
        for(int i=63;i>=1;i--){
            if(x&(1ll<<i)){
                if(a[i]==0){
                    a[i]=x;//放入线性基,那么可以是插入的了
                    return 1;
                }
                else x^=a[i];//否则插入x^a[i],既然a[i]插入了,并且x^a[i]插入了,那么相当于x也插入了
            }
        }
        return 0;
    }
    

     

    最大异或和:

    根据上面构造的基底,我们可以从高往低枚举基底

    如果ans当前位为1,肯定不需要去异或基底,因为异或后当前位变成0,低位的影响就无足轻重了

    如果ans当前位为0,肯定需要去异或基底,因为异或后当前位变成1

    所以只要能使得ans增加的,我们就异或上它

    for(int i=62;i>=0;i--) if((ans^p[i])>ans) ans=ans^p[i];//从线性基中得到最大值
    

      

    求区间基底

    https://codeforces.com/contest/1100/problem/F

    void inser(int inde,int x){
        rep(i,0,20)base[inde][i]=base[inde-1][i];
        PII now=mp(x,inde);
        per(i,0,20){
            if(now.fi&(1<<i)){
                if(base[inde][i].fi==0){
                    base[inde][i]=now;
                    return ;
                }
                if(now.se>base[inde][i].se)swap(now,base[inde][i]);
                now.fi^=base[inde][i].fi;
            }
        }
    }
    

      

  • 相关阅读:
    winfrom 对话框
    容器控件
    简单记事本整理
    公共控件
    winfrom。布局
    ado 小测试
    ado.not--更改精简练习
    ado.not--数据库防字符串注入攻击学习及 练习
    ado.not--练习题
    ado.not--添加练习题
  • 原文地址:https://www.cnblogs.com/carcar/p/11233881.html
Copyright © 2011-2022 走看看