如题,赛时没想出做法,赛后意识到可以字典树但是T的更惨(还没赛时骗的多)
#include<bits/stdc++.h>
using namespace std;
const int MAX=2e6+5;
int b[MAX],f[MAX],n,ans[MAX];
// 快读
set<int> s;
int ch[MAX*21][2],tot;
int tag[MAX*21];
int read(){
int x = 0;
char c = getchar();
while(c < '0' || c > '9'){
c = getchar();
}
while(c >= '0' && c <= '9'){
x = x*10+c-'0';
c = getchar();
}
return x;
}
int pmax;
void insert(int x){
int u=1;
for(int i=pmax;i>=0;--i){
int c=0;
if(x&(1<<i))
c=1;
if(!ch[u][c]){
ch[u][c]=++tot;
}
u=ch[u][c];
}
tag[u]=x;
}
bool check(int x){
int u=1;
for(int i=pmax;i>=0;--i){
if(x&(1<<i)){
if(ch[u][0]){
u=ch[u][0];
}
else
u=ch[u][1];
}
else{
if(ch[u][1])
u=ch[u][1];
else
u=ch[u][0];
}
}
return (tag[u]^x)<=n;
}
void solve(){
n=read();
s.clear();
for(int i=1;i<=n-1;++i)
b[i]=read();
f[1]=0;
for(int i=2;i<=n;++i)
f[i]=f[i-1]^b[i-1];
pmax=0;
for(int i=0;i<=21;++i){
if(n&(1<<i))
pmax=i;
}
tot=1;
for(int i=1;i<=n;++i){
insert(f[i]);
s.insert(f[i]);
}
int res=0;
for(int i=1;i<=n;++i){
if(s.find(i)==s.end()&&check(i)){
res=i;
break;
}
}
for(int i=1;i<=n;++i){
printf("%d ",res^f[i]);
}
for(int i=1;i<=tot;++i){
ch[i][0]=ch[i][1]=0;
}
printf("\n");
}
int main(){
int T;
T=read();
while(T--){
solve();
}
}