hdu4825-01字典树&&贪心&&经典&&异或最大-Xor Sum
2017-09-01 12:49
411 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4825
01字典树可以解决最大异或问题。
把数当成 二进制存到一个 字典树里,不过这个字典树只有0和1,
异或的时候当然要找相反的开始,如果没有再找相同的。
注:记录的时候从高位开始往低位。没有的置0
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; }
相关文章推荐
- hdu4825 Xor Sum 字典树与异或(经典)
- hdu5969-贪心&思维&证明-最大的异或
- BZOJ 3261 最大异或和 && qwb VS 去污棒(可持久化01Trie)
- Codeforces Round #430-01字典树&类异或最大值-D. Vitya and Strange Lesson
- ☆ [HDU4825] Xor Sum「最大异或和(Trie树)」
- ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)
- Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值
- COJ 1216: 异或最大值(01字典树)
- 【线性基】51nod1312 最大异或和&LOJ114 k大异或和
- 经典面试题--寻找01矩阵中最大的1矩形(POJ 3494)
- 【BZOJ 4571】美味 【区间异或最大值】【主席树】【贪心】
- Xor Sum---hdu4825(01字典树模板)
- CSUOJ 1216 异或最大值 (01Trie)
- hdu 3572 Task Schedule(最大流&&建图经典&&dinic)
- 使用01字典树解决最大异或问题
- BZOJ 1954 (POJ 3764) Trie的经典应用 求树上最大异或值
- bzoj3261最大异或和&&可持久化Trie树详解
- POJ 2455--Secret Milking Machine【二分枚举 && 最大流 && 经典】
- HPU 2686--Matrix【最大费用最大流 && 经典建图】
- POJ 2391--Ombrophobic Bovines【拆点 && 二分 && 最大流dinic && 经典】