OJ题目:click here~~
题目分析:在n个数中,找一个数使得与给定的某个数的异或值最大。
异或最大,就是两个数的二进制表示中,相同位上的数不同 。用前缀树贪心。
AC_CODE
struct TrieNode{
int val ;
TrieNode *next[2] ;
};
void Insert(TrieNode *root , int val){
TrieNode *now = root ;
int t ;
for(int i = 31;i >= 0;i--){
if(val&(1<<i)) t = 1;
else t = 0 ;
if(now->next[t] == NULL){
TrieNode *n = (TrieNode *)malloc(sizeof(TrieNode)) ;
n->next[0] = n->next[1] = NULL ;
now->next[t] = n ;
now = n ;
}
else
now = now->next[t] ;
}
now->val = val ;
}
LL Get(TrieNode *root , int val){
TrieNode *now = root ;
int t ;
for(int i = 31;i >= 0;i--){
if(val&(1 << i)) t = 1 ;
else t = 0 ;
if(now->next[t^1] != NULL)
now = now->next[t^1] ;
else
now = now->next[t] ;
}
return now->val ;
}
void clear(TrieNode *root){
for(int i = 0;i < 2;i++){
if(root->next[i] != NULL)
clear(root->next[i]) ;
}
free(root) ;
}
int main(){
//freopen("in.txt" , "r" , stdin) ;
int t , T = 1 ;
cin >> t ;
while(t--){
int i , j , k , n , m ;
int a ;
TrieNode *root = (TrieNode *)malloc(sizeof(TrieNode)) ;
root->next[0] = root->next[1] = NULL ;
cin >> n >> m ;
for(i = 0;i < n;i++){
scanf("%d",&a) ;
Insert(root , a) ;
}
printf("Case #%d:\n",T++);
for(i = 0;i < m;i++){
scanf("%d",&a) ;
printf("%d\n",Get(root , a)) ;
}
}
return 0 ;
}