hdu 4825 Xor Sum (建树) 2014年百度之星程序设计大赛 - 资格赛 1003

时间:2021-11-02 08:28:16

题目

题意:给n个数,m次询问,每次给一个数,求这n个数里与这个数 异或 最大的数。

思路:建一个类似字典数的数,把每一个数用 32位的0或者1 表示,查找从高位向底位找,优先找不同的,如果没有不同的,就找相同的。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
const int maxn = ;
int p[maxn][], cnt; //cnt代表序号,<= maxn
__int64 val[maxn]; void init()
{
memset(p, , sizeof(p));
cnt = ;
}
void insert(int x)
{
int u = , v, i;
for(i = ; i >= ; i--)
{
v = (x&(<<i))? : ;
if(!p[u][v])
p[u][v] = cnt++;
u = p[u][v];
}
val[u] = x;
}
void find(int x)
{
int u = , v, i;
for(i = ; i >= ; i--)
{
v = (x&(<<i))? : ;
if(p[u][v^])
u = p[u][v^];
else
u = p[u][v];
}
printf("%I64d\n", val[u]);
}
int main()
{
int t, n, m, i, ca;
__int64 x;
while(~scanf("%d", &t))
{
ca = ;
while(t--)
{
init();
scanf("%d%d", &n, &m);
for(i = ; i < n; i++)
{
scanf("%I64d", &x);
insert(x);
}
printf("Case #%d:\n", ca++);
for(i = ; i < m; i++)
{
scanf("%I64d", &x);
find(x);
}
}
}
return ;
}