題目
題目概要
對於 ,記 ,求 中第 大的元素。
思路
其實就是板題 😅 求一個線性基,然後處理一下就好了。
有一個細節,讓 ,然後進行抉擇,類似於權值線段樹的操作。
代碼
#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;
}