Menci 这个讲的太详细了吧 … 没有什么再好讲的了啊 …
扔板跑好了 …
// 子集最大异或和
const int MAXN = 60;
void insert(ll t) {
for (int j = MAXL; j >= 0; j --) {
if (!t) return;
if (!(t & (1ll << j))) continue;
if (a[j]) t ^= a[j];
else {
for (int k = 0; k < j; k++) if (t & (1ll << k)) t ^= a[k];
for (int k = j + 1; k <= MAXL; k++) if (a[k] & (1ll << j)) a[k] ^= t;
a[j] = t;
break;
}
}
}
ll queryMax() {
ll res = 0;
for (int i = 0; i <= MAXL; i++) res ^= a[i];
return res;
}