C++风格,动态分配内存,带销毁,01-trie(字典树)。
http://acm.hdu.edu.cn/showproblem.php?pid=4825
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
struct node{
node *son[2] = {nullptr, nullptr};
bool eq = false;
}*root;
void destroy(node *p)
{
if (p == nullptr) return ;
if (p -> son[0]){
destroy(p -> son[0]);
p -> son[0] = nullptr;
}
if (p -> son[1]){
destroy(p -> son[1]);
p -> son[1] = nullptr;
}
delete []p;
}
void add(int x)
{
node *p = root;
for (int i = 31; i >= 0; --i){
int ka = (x >> i) & 1;
if (p -> son[ka & 1]) p = p -> son[ka & 1];
else{
p -> son[ka & 1] = new node;
p = p -> son[ka & 1];
}
}
p -> eq = true;
}
int query(int x)
{
int ans = 0;
node *p = root;
for (int i = 31; i >= 0; --i){
int ka = (x >> i) & 1;
if (p -> son[ka ^ 1]){
ans += (ka ^ 1) ? (1 << i) : 0;
p = p -> son[ka ^ 1];
}else{
ans += (ka & 1) ? (1 << i) : 0;
p = p -> son[ka & 1];
}
}
return ans;
}
int main()
{
int t;
scanf("%d", &t);
for (int i = 1; i <= t; ++i){
root = new node;
int n, m, x;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i){
scanf("%d", &x);
add(x);
}
printf("Case #%d:\n", i);
while (m--){
scanf("%d", &x);
printf("%d\n", query(x));
}
destroy(root);
}
return 0;
}