线性基学习笔记
用法&&概述
线性基可以看做是一种数据结构,可以用来维护序列的异或相关(比如去重,求极值)
似乎还可以求异或后的第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\)
嗯,就这样了...