首先板子
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,那么存在