您的位置:首页 > 其它

hdu4825-01字典树&&贪心&&经典&&异或最大-Xor Sum

2017-09-01 12:49 411 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4825

01字典树可以解决最大异或问题。

把数当成 二进制存到一个 字典树里,不过这个字典树只有0和1,

异或的时候当然要找相反的开始,如果没有再找相同的。

注:记录的时候从高位开始往低位。没有的置0

#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
/* 01字典树,大概就是用字典树的思想把
每个数变成 二进制,然后
查找,每次尽可能的查找他的相反的。(异或最大)
*/
struct Node{
int num;//标号上的数
Node *next[2];//指针。
};
void  add(Node *head,int num){
Node *p=head;
for(int i=31;i>=0;i--){
int k=(num>>i)&1;
//num>>=1;
if(p->next[k]==NULL){
p->next[k]=new Node();
p=p->next[k];
}
else
p=p->next[k];
}
p->num=num;
}

int query(Node *head,int sum){
Node *p=head;
for(int i=31;i>=0;i--){
int sign=(sum>>i)&1;
if(p->next[1^sign]==NULL){
p=p->next[sign];
}
else
p=p->next[1^sign];
}
return p->num;
}
int t,m,n,a;
int main()
{   scanf("%d",&t);
for(int tt=1;tt<=t;tt++){
scanf("%d%d",&m,&n);
Node *head=new Node();
for(int i=0;i<m;i++){
scanf("%d",&a);
add(head,a);
}
printf("Case #%d:\n",tt);
for(int i=0;i<n;i++){
scanf("%d",&a);
printf("%d\n",query(head,a));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二进制