题目大意:
参考代码:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int M=1e6+7;
int n,k,T;
LL B[M],pre[M],A[M],c[40];
LL vis[40];
int main(){
scanf("%d",&T);
while(T--){
int f=0;
scanf("%d%d",&n,&k);
pre[0]=0;
for(int i=1;i<n;i++){
scanf("%lld",&B[i]);
pre[i]=pre[i-1]^B[i];
}
int cnt=31;
for(int i=0;i<=35;i++) c[i]=vis[i]=0;
for(int i=1;i<n;i++){
for(int bit=30;bit>=0;bit--){
if(B[i]==0) continue;
if((B[i]>>bit)&1){
if(pre[i-1]&(1<<bit)){
if(vis[bit]&&!c[bit]){
f=1;
}
c[bit]=1; vis[bit]=1;
}else {
if(vis[bit]&&c[bit]){
f=1;
}
c[bit]=0; vis[bit]=1;
}
cnt--;
break;
}
}
}
//cout<<f<<" "<<cnt<<"\n";
if(f || 1ll*k>(1ll<<cnt)){
printf("-1\n"); continue;
}
A[1]=0; cnt=0; k--;
while(k){
while(vis[cnt]) cnt++;
if(k&1) c[cnt]=1;
k>>=1;
cnt++;
}
for(int bit=0;bit<=30;bit++) A[1]+=(c[bit]<<bit);
for(int i=2;i<=n;i++) {
A[i]=A[1]^pre[i-1];
if(A[i]>=(1ll<<30)){
f=1;
}
}
if(f){
printf("-1\n"); continue;
}
for(int i=1;i<=n;i++) printf("%lld ",A[i]);
printf("\n");
}
}