const int d=30;
struct Linear_Base {
int a[d];
void init() {//初始化
memset(a, 0, sizeof a);
}
void insert(int x) {//插入元素
for (int i = d; i >= 0; i--)
if (x >> i & 1) {
if (a[i]) x ^= a[i];
else {
a[i] = x;
return;
}
}
}
void operator+=(const Linear_Base &t) {//合并线性基
for (int i = d; i >= 0; i--)
insert(t.a[i]);
}
int query() {//查询最大异或值
int ans = 0;
for (int i = 29; i >= 0; i--)
if ((ans ^ a[i]) > ans) ans ^= a[i];
return ans;
}
};