题目
题目概要
对于 ,记 ,求 中第 大的元素。
思路
其实就是板题 😅 求一个线性基,然后处理一下就好了。
有一个细节,让 ,然后进行抉择,类似于权值线段树的操作。
代码
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
typedef long long int_;
inline int_ readint(){
int_ x; scanf("%lld",&x); return x;
}
int_ d[100]; int cnt;
void insert(int_ x){
for(int i=63; i>=0&&x; --i){
if((x>>i&1) == 0) continue;
if(d[i] != 0) x ^= d[i];
else {
d[i] = x, ++ cnt; break;
}
}
}
int main(){
int kase = 0;
for(int T=readint(); T; --T){
int n = readint();
for(int i=0; i<64; ++i) d[i] = 0;
for(int i=cnt=0; i<n; ++i)
insert(readint());
printf("Case #%d:\n",++kase);
for(int q=readint(); q; --q){
int_ k = readint(), ans = 0;
if(k == 1 and cnt < n){
puts("0"); continue;
}
int now = cnt; k -= (cnt < n);
for(int i=63; i>=0; --i){
if(d[i] == 0) continue;
if(ans>>i&1) ans ^= d[i];
int_ f = (1ll<<(now-1));
if(ans == 0) // 一个都没选
-- f; // 去掉全都不选的方案
if(k > f)
k -= f, ans ^= d[i];
-- now; // 去掉这个抉择
}
if(k > 1) puts("-1");
else printf("%lld\n",ans);
}
}
return 0;
}