线性基

u64 p[64];
void insert(u64 x) {
for (int i = 63; ~i; --i) {
if (!(x >> i)) {
continue;
}
if (!p[i]) {
p[i] = x;
break;
}
x ^= p[i];
}
}
void init() {
for (int i = 0; i < 64; i++) {
p[i] = 0;
}
}

Bitset 线性基

image-20241016155808158

using bit = bitset<100>;
const int N = 100;
bit p[N + 5];
vector<int> idx[N + 5];
void insert(int j, bit x) {
vector<int> cur;
cur.emplace_back(j);
for (int i = 100; ~i; --i) {
if ((x >> i & bit(1)) == bit(0)) {
continue;
}
if (p[i] == bit(0)) {
p[i] = x;
idx[i] = cur;
break;
}
x ^= p[i];
for (auto t : idx[i]) {
cur.emplace_back(t);
}
}
}