HDU [P3949] XOR

线性基求第 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:\n", 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\n");
			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;
}
posted @ 2018-03-14 20:21  Mr_Wolfram  阅读(150)  评论(0编辑  收藏  举报