hdu4825-Xor Sum
用Trie树来储存数据,然后query的时候之间拿到深度最大的极为异或值最大的。
//
// main.cpp
// 01字典树_异或最大值
//
// Created by 陈冉飞 on 2019/9/8.
// Copyright © 2019 陈冉飞. All rights reserved.
//
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define maxn 100010
#define cl(a,b) memset(a,b,sizeof(a))
int Trie[maxn*16][2],val[maxn*16],cnt,T,n,m,x,kase = 1;
void insert(ll v){
int u = 0;
for(int i=32 ;i>=0 ;i--){
int c = (v>>i)&1;
if(!Trie[u][c]) Trie[u][c] = ++cnt;
u = Trie[u][c];
}
val[u] = v;
}
int query(ll v){
int u = 0;
for(int i=32 ;i>=0 ;i--){
int c = (v>>i)&1;
if(Trie[u][c^1]) u = Trie[u][c^1];
else u = Trie[u][c];
}
return val[u];
}
int main(){
scanf("%d",&T);
while(T--){
cnt= 0;cl(Trie,0);cl(val, 0);
printf("Case #%d:\n",kase++);
scanf("%d%d",&n,&m);
for(int i=1 ;i<=n ;i++){scanf("%d",&x);insert(x);}
for(int i=1 ;i<=m ;i++){
scanf("%d",&x);
printf("%d\n",query(x));
}
}
return 0;
}
CSU 1216 异或最大值: