线性基
可以解决如下问题:
给定一个集合S,包含若干个数 a 1 , a 2 , … , a n a_1,a_2,\dots ,a_n a1,a2,…,an
- 求S子集中所有元素异或和的最大值、最小值、第k小、第k大、所有子集异或之和。
- 判断一个数是否可以被S某子集元素异或出来。
struct LinerBasis{
ll p[64],rk,tot;
//p集合中的元素是S的一组极大线性无关组
//rk是秩,tot是插入元素的个数
//1<<rk或者(1<<rk)-1就是不同异或和的种数
LinerBasis(ll a[],int n){
memset(p,0,sizeof(p));
tot=rk=0;
for(int i=0;i<n;++i)rk+=insert(a[i]);
//能插入,则秩加一
}
void rebuild(){
//将p从行阶梯矩阵通过行变换变成行简化阶梯矩阵
int num=0;
for