线性基:处理异或操作的强大工具,思想也是可以借鉴的。
作用:用于处理多个数中选取一些数的XOR的最大值,最小值,第k大值,并可以查询能否通过集合中任意个数XOR得到,时间复杂度为O(n*logn)
具体模板如下,思路和代码均参考于大佬的博客,感谢解惑~
链接:传送门
模板:
struct Linear_Basis
{
int num[max_log];//插入数组
void init()
{
memset(num,0,sizeof(num));
}
//将u插入num数组中
void insert(int u)
{
int i;
for(i=max_log;i>=0;i--)
{
if(u&(1<<i))//如果u的这一位有值,则进行判断
{
if(!num[i])//如果这位为0
{
num[i]=u;//u赋值给它
}
else
{
u^=num[i];//不为0,则u异或这个数
}
}
}
}
/*
操作之后u只有两种结果:
1.被记录到了数组中
2.未被记录,则此时u必定为0,说明此时的线性基已经能通过Xor得到u.
因此我们可以用这种方法来判断此时是否存在Xor值为u的子集.
*/
//查询操作
bool check(int u)
{
int i;