看别的大佬博主学的容易看的懂的代码
#include"bits/stdc++.h"
#define ll long long
using namespace std;
const int N = 100005*32;
int s[N][2],sum[N];
int k = 1;
ll t,n,m,x;
//建树 和字符串建树的区别是 把一个数字转换成二进制而存入图中
void insert(ll x){
ll p = 0;
for(int i=31;i>=0;i--){
ll lp = x >> i & 1;
if(!s[p][lp]) s[p][lp]=k++;
p = s[p][lp];
}
sum[p] = x; // 最后sum[p]代表根据你建立的二进制而找到的最后对应数字
}
// 查找
ll search(ll x){
ll p = 0;
for(int i=31;i>=0;i--){
ll lp = x >> i & 1;
if(s[p][!lp]) p = s[p][!lp];
else p = s[p][lp];
}
return sum[p];
}
int main()
{
ios::sync_with_stdio(false);
cin >> t;
int cnt = 1;
while(t--)
{
memset(s,0,sizeof s);
memset(sum,0,sizeof sum);
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> x;
insert(x);
}
cout << "Case #"<<cnt++<<":" << endl;
while(m--)
{
cin >> x;
cout << search(x) << endl;
}
}
return 0;
}