template<typename T> classLinerBasis { public: LinerBasis(vector<T> &arr, T n): basis(arr), n(n), len(0) { zero = false; compute(); } voidcompute() { len = 1; for (int i = BIT; i>=0; i--) { for (int j = len; j<=n; j++) { if (basis[j]&(1ll<<i)) { swap(basis[j], basis[len]); break; } } if (basis[len]&(1ll<<i)) { for (int j = 1; j<=n; j++) { if (j!=len&&(basis[j]&(1ll<<i))) { basis[j] ^= basis[len]; } } len++; } } len--; zero = (n!=len); }
boolhaszero() { return zero; }
vector<T> result() { return basis; }
T queryk(T k) { if (zero&&k==1) return0; if (zero) k--; if (k>=(1ll<<len)) return-1; T ans = 0; for (int i = len, j = 0; i>=1; i--, j++) { ans^=basis[i]; } return ans; }
private: constint BIT = 60; vector<T> &basis; bool zero; T len; T n; };