这道题就是一个裸的字典树,思路:把输入的数组元素全部插入字典树,然后按照上面说的方法进行查询。
建树规则:将数转化成32位二进制字符串,然后由高位到低位像建立字典树一样建树。
查询规则:将要查询的数也转化成32位二进制字符串,然后在树中查找。如果不同边有路,就走不同边(保证当前位异或为1)否则走相同边。因为是从高位到低位查找,保证查找到的数为和待查询数异或值最大。代码:
#include <stdio.h>
#include <iostream>
using namespace std;
#define LL long long
struct node //节点
{
LL num;
node *child[2];
node()
{
num=0;
child[0]=NULL;
child[1]=NULL;
}
};
node *root;
void Insert(LL a) //建树
{
int i;
node *pre=root;
for(i=31;i>=0;i--) //32层
{
int k=((1<<i)&a)>>i;
if(pre->child[k]!=NULL)
{
pre=pre->child[k];
}
else
{
pre->child[k]=new node();
pre=pre->child[k];
}
}
pre->num=a;
}
LL Query(LL a) //查询
{
int i;
node *pre=root;
for(i=31;i>=0;i--) //32层
{
int k=((1<<i)&a)>>i;
if(pre->child[k^1]==NULL)
{
if(pre->child[k]!=NULL)
pre=pre->child[k];
}
else
{
pre=pre->child[k^1];
}
}
return pre->num;
}
int main()
{
int T,n,m,i,j,cnt=0;
scanf("%d",&T);
while(T--)
{
cnt++;
LL a;
scanf("%d%d",&n,&m);
root=new node();
for(i=0;i<n;i++)
{
scanf("%lld",&a);
Insert(a);
}
printf("Case #%d:\n",cnt);
for(i=0;i<m;i++)
{
scanf("%lld",&a);
printf("%lld\n",Query(a));
}
}
return 0;
}
该博客介绍了如何使用字典树解决HDU4825问题,强调了将数字转化为32位二进制字符串进行建树和查询的策略。在构建字典树时,从高位到低位进行,查询时遵循特定路径选择规则以找到与目标数异或值最大的数。
9万+

被折叠的 条评论
为什么被折叠?



