线性基
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 线性基

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); } }}