线性基学习笔记

用法&&概述

线性基可以看做是一种数据结构,可以用来维护序列的异或相关(比如去重,求极值)
似乎还可以求异或后的第k小值,但我不会

对于值域,转成二进制之后的每一位 i 对应一个数 a[i],然后维护这个数。
a[i] 它的二进制最高位就是第i位

具体维护方式是:
对于每次插入一个新的值 x
进行如下操作:
1· 若此时x的二进制最高位 k ,a[k] 的值为零,将a[k]=x,退出
2· 否则 x^=a[k] , 此时x的第k位就为0了,然后继续 1操作,或者x==0退出

代码

插入

int add(ll x)
{
    for(re int i=62; i>=0;i--)
    if(x&(1LL<<i))
    {
        if(!a[i]) {a[i]=x;return 1;}
        else x^=a[x];
    }
    return 0;
}

求MAX

int getmax()
{
    ll ans=0;
    for(re int i=52;i>=0;i--)
        ans=max(ans,ans^a[i]);
}

查询最小值: 就是线性基中的最小值
可通过线性基可异或出的值个数: \(2^{线性基元素个数}-1\)

posted @ 2020-06-19 11:14  yzhx  阅读(142)  评论(0编辑  收藏  举报