#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
struct Node{
struct Node* nt[2];
};
Node node;
void add_num( Node *a, long long pos, long long num ){
if( pos < 0 ){
return;
}
if( ( 1LL << pos ) & num ){
if( a->nt[1] == NULL ){
Node *b = new Node;
b->nt[0] = b->nt[1] = NULL;
a->nt[1] = b;
}
add_num( a->nt[1], pos - 1, num );
}else{
if( a->nt[0] == NULL ){
Node *b = new Node;
b->nt[0] = b->nt[1] = NULL;
a->nt[0] = b;
}
add_num( a->nt[0], pos - 1, num );
}
}
long long query( Node *a, long long pos, long long num ){
if( pos < 0 ){
return 0;
}
if( ( 1LL << pos ) & num ){
if( a->nt[0] != NULL ){
return query( a->nt[0], pos - 1, num );
}else if( a->nt[1] != NULL ){
return ( 1LL << pos ) | query( a->nt[1], pos - 1, num );
}
}else{
if( a->nt[1] != NULL ){
return ( 1LL << pos ) | query( a->nt[1], pos - 1, num );
}else if( a->nt[0] != NULL ){
return query( a->nt[0], pos - 1, num );
}
}
}
/*
void del( Node *a ){
if( a->nt[0] != NULL ){
del( a->nt[0] );
}
if( a->nt[1] != NULL ){
del( a->nt[1] );
}
delete a;
}
*/
int main(){
int T, N, M, Case = 1;
scanf( "%d", &T );
while( T-- ){
scanf( "%d%d", &N, &M );
node.nt[0] = node.nt[1] = NULL;
for( long long i = 0; i < N; i++ ){
long long temp;
scanf( "%I64d", &temp );
add_num( &node, 34, temp );
}
printf( "Case #%d:\n", Case++ );
for( long long i = 0; i < M; i++ ){
long long temp;
scanf( "%I64d", &temp );
long long ans = query( &node, 34, temp );
printf( "%I64d\n", ans );
}
/*
if( node.nt[0] != NULL ){
del( node.nt[0] );
}
if( node.nt[1] != NULL ){
del( node.nt[1] );
}
*/
}
return 0;
}
2014百度之星资格赛1003
最新推荐文章于 2017-08-05 18:46:13 发布