线性基学习

首先板子

const int L = 63;
ll d[L];
bool add(ll x)
{
    for(int i = L - 1; i >= 0; i--)
        if(x & 1ll << i)
        {
            if(d[i] == -1)
            {
                d[i] = x;
                return true;
            }
            x ^= d[i];
        }
    return false;
}

线性基的规模就是你二进制的位数

如果要判断两个线性基的值域相同 只需要依次插入值就好了 详见agc045 A题解  链接:https://www.cnblogs.com/acmLLF/p/13636575.html

线性基的第L个元素,最高位一定是第L位,且为1

所以要是取最大值,依次从大到小取max异或就行了,因为后面不会覆盖前面的最高位,但有可能覆盖低位,所以取个max就行了

最小值直接取线性基中最小值  特殊处理0,注意 因为线性基的值域 一定不包含0

查询是否存在于此基的值域中,取此数二进制下每一位,依次从大到小异或,若为1,则异或,若0,则下一位继续 

若异或的最终答案是0,那么存在

原文地址:https://www.cnblogs.com/acmLLF/p/13639287.html