SOJ-4075(n个数异或第k大的数)
来源:互联网 发布:python 图片转字符画 编辑:程序博客网 时间:2024/04/30 10:12
/****************************************************************************************************** ** Copyright (C) 2011.07.01-2013.07.01 ** Author: famousDT <13730828587@163.com> ** Edit date: 2011-10-03******************************************************************************************************/#include <stdio.h>#include <stdlib.h>//abs,atof(string to float),atoi,atol,atoll#include <math.h>//atan,acos,asin,atan2(a,b)(a/b atan),ceil,floor,cos,exp(x)(e^x),fabs,log(for E),log10#include <vector>#include <queue> #include <map>#include <time.h>#include <set>#include <stack>#include <string>#include <iostream>#include <assert.h>#include <string.h>//memcpy(to,from,count#include <ctype.h>//character process:isalpha,isdigit,islower,tolower,isblank,iscntrl,isprll#include <algorithm>using namespace std;typedef long long ll;#define MY_PI acos(-1)#define MY_MAX(a, b) ((a) > (b) ? (a) : (b)) #define MY_MIN(a, b) ((a) < (b) ? (a) : (b))#define MY_MALLOC(n, type) ((type *)malloc((n) * sizeof(type)))#define MY_ABS(a) (((a) >= 0) ? (a) : (-(a)))#define MY_INT_MAX 0x7fffffff/*==========================================================*\| 高斯消元+| 把n个数拿去高斯消元,于是这n个数的所有异或结果就可以用那一组| 线性基来表示了。 特判掉0以后,将K分解二进制,对应的是1的位的| 那个基向量拿去异或就是答案\*==========================================================*/ll d[10000 + 1];ll n;ll base = 0;void gauss(const ll m = 62){ base =0; ll i, j; for (i = m; i >= 0; --i) { int flag = 0; for (j = base; j < n; ++j) { if ((d[j] >> i) & 1) { swap(d[base], d[j]); flag = 1; break; } } if (flag) { for (j = 0; j < n; ++j) { if (j != base && (d[j] & ((ll)1 << i))) d[j] ^= d[base]; } ++base; } }}int main(){ ll cases; ll i, j; ll q; ll ask; cin>>cases; ll index = 1; while (cases--) { scanf("%lld", &n); for (i = 0; i < n; ++i) { scanf("%lld", &d[i]); } gauss(); printf("Case #%lld:\n", index++); scanf("%lld", &q); for (i = 0; i < q; ++i) { scanf("%lld", &ask); if (base < n) { if (ask == 1) { printf("0\n"); continue; } else ask -= 1; } if (ask >= ((ll)1 << base)) { printf("-1\n"); continue; } ll ans = 0; for (j = 0; j < 63; ++j) { if ((ask >> j) & 1) ans ^= d[base - j - 1]; } printf("%lld\n", ans); } } return 0;}