前言
首先讲一下线性基是什么东西,线性基是一个集合,你在原集合中找到一个子集,子集中的数xor起来一定能在线性基中找一个对应子集的xor和与其相等。
比如说,{x,y}和{x,x^y} 就满足这么样一个关系。
原理
我们把这个扩展一下,比如说我们现在有一个集合A,我新加进来一个数a,那么a与A中的数xor一下肯定是没有问题的。
性质
定义一个数的M值为他二进制上第一个1出现的位置。
我们每往线性基中插入一个数,我们要让这个数的M值与之前线性基中的每一个数的M值都不同。
插入
那么如何实现呢?
void insert(LL c){
for (int i=51;i>=0;i--){
if (c&bit[i]){
if (!xxj[i]){
xxj[i]=c;
break;
}
c=c^xxj[i];
}
}
}
在这里