线性基求第 k 小异或值
http://www.cnblogs.com/Mr-WolframsMgcBox/p/8567844.html
这道题消元下来是一个上三角矩阵,代码简单,但是不使用与本题的情况
本题需要消成一个对角矩阵,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#define ll long long
#define MA_BASE 62
using namespace std;
ll T, n, m, lb[10005], num[10005];
int main() {
cin >> T;
for(int qwq = 1; qwq <= T; qwq++) {
cin >> n;//cout<<n<<endl;
memset(lb, 0, sizeof(lb));
for(int i = 1; i <= n; i++) {
cin >> num[i];
for(int j = MA_BASE; j >= 0; j--) {
if(num[i] & (1ll << j)) {
if(!lb[j]) {
lb[j] = num[i];
for(int k = j - 1; k >= 0; k--) if(lb[k] && (lb[j] & (1ll << k))) lb[j] ^= lb[k];
for(int k = j + 1; k <= MA_BASE; k++) if(lb[k] & (1ll << j)) lb[k] ^= lb[j]; //注意是 j 不是 k
break;
}else num[i] ^= lb[j];
}
}
}
cin >> m;
vector <ll> LB;
LB.clear();
for(int i = 0; i <= MA_BASE; i++) if(lb[i]) LB.push_back(lb[i]);
/*for(int i = 0; i < LB.size(); i++) cout<<LB[i]<<" ";
cout<<endl;*/
printf("Case #%d:
", qwq);
for(int i = 1; i <= m; i++) {
ll k;
cin >> k;
if(LB.size() == n) k++;
k--;
if(k >= (1ll << LB.size())) printf("-1
");
else {
ll ans = 0;
for(int i = LB.size() - 1; i >= 0; i--) {
if(k & (1ll << i)) {
ans ^= LB[i];
}
}
cout<<ans<<endl;
}
}
}
return 0;
}