线性基
概念:
对于若干个$m$位的二进制数$a_1,a_2,……,a_n$,它们任意组合异或出的结果全部可以用不超过$m$个数$b_1,b_2,……,b_n$异或出来
且$b_i$的最高位是第$i$位,则$b$称为$a$的线性基
构造:
每向a中加入一个元素$x$时,从高到低扫描$x$的每一位
扫描到第$i$位时,如果第$i$位为0就跳过
如果为1,若$b_i$不存在,就把$b_i$赋成$x$并退出,否则让$x\hat{} =b_i$以保证$x$的最高位小于$i$
void insert(long long x){ for(int i=62;~i;i--){ if(x&(1ll<<i)){ if(!a[i]){a[i]=x;return;} x^=a[i]; } } }
查询异或最大值:
把ans赋成0,从高往低扫$b_i$
若$ans\hat{} b>ans$,则$ans\hat{} =b_i$
long long Max(){ long long ans=0; for(int i=62;~i;i--){ ans^=(ans&(1ll<<i))?0:a[i];//如果ans第i位不为1就ans^=a[i] } return ans; }
结构体
#define LL long long struct Base{ LL a[63]; void insert(LL x){ for(int i=62;~i;i--){ if(x&(1ll<<i)){ if(!a[i]){a[i]=x;return;} x^=a[i]; } } } LL Max(){ LL ans=0; for(int i=62;~i;i--){ ans^=(ans&(1ll<<i))?0:a[i]; } return ans; } };