关于线性基的一些理解

参考博客:

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

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

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

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

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

插入:

 

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;
}

 最大异或和:

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

  

 

转载于:https://www.cnblogs.com/carcar/p/11233881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值