Link
线性基板子,求一个数列可以得到的第
k
k
k 小异或值。
int t = 0;
int n;
vector<ull> b;
void insert(ull x) {
for(auto i : b)
x = min(x, x ^ i);
for(auto& i : b)
i = min(i, x ^ i);
if(x)
b.pb(x);
}
void solve() {
printf("Case #%d:\n", ++t);
cin >> n;
b.clear();
for(int i = 1; i <= n; i++) {
ull x;
cin >> x;
insert(x);
}
int q;
cin >> q;
sort(b.begin(), b.end());
for(int i = 1; i <= q; i++) {
ull k;
cin >> k;
if(b.size() < n) k--;
ull ans = 0;
for(auto i : b) {
if(k & 1) ans ^= i;
k >>= 1;
}
if(k == 0) {
cout << ans << endl;
}
else {
cout << -1 << endl;
}
}
}