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;}

 
原创粉丝点击