發現了線性基的一些性質和用法
線性基合併
直接把另一個暴力插入。
可以判一下如果滿了就不插入,剪枝很有作用
一定要滿足從高位到低位貪心
struct Data{
int a[32];
bool flag;
Data(){ memset(a,0,sizeof(a)); flag = 0; }
Data operator + (Data z){
Data res = z;
if ( z.flag ) return res;
if ( flag ) return *this;
for (int i = 30 ; i >= 0 ; i--){
int x = a[i];
for (int j = 30 ; j >= 0 ; j--){
if ( x >> j & 1 ){
if ( !(res.a[j] >> j & 1) ){ res.a[j] = x; break; }
x ^= res.a[j];
}
}
}
res.flag = 1;
for (int i = 29 ; i >= 0 ; i--){
res.flag &= (res.a[i] >> i) & 1;
if ( res.a[30] >> i & 1 ){
res.a[30] ^= res.a[i];
}
}
return res;
}
void insert(int x){
for (int j = 29 ; j >= 0 ; j--){
if ( x >> j & 1 ){
if ( !(a[j] >> j & 1) ){ a[j] = x; break; }
x ^= a[j];
}
}
}
};