HDU 4825 Xor Sum(01字典树)
来源:互联网 发布:程序员客栈 36kr 编辑:程序博客网 时间:2024/06/03 21:47
题意:找出一个与给你的数字 异或最大的数字
思路;建立0.1 字典树,在找的时候找二进制想法的位置
#include <stdio.h>#include <algorithm>#include <cstring>#include <bitset>using namespace std;const int N=33;struct node{ node *nxt[2]; int val; node() { val=0; fill(nxt,nxt+2,nullptr); }};node *root;void update(int n){ bitset<N> bit=n; int num; node *cur=root; for (int i=32; i>=0; --i) { num=bit[i]; if(!cur->nxt[num]) { node *tmp=new node(); cur->nxt[num]=tmp; cur=tmp; } else cur=cur->nxt[num]; } cur->val=n; //最后记录当前数字是多少}int query(int k){ bitset<N> bit=k; node *cur=root; int num; for (int i=32; i>=0; --i) { num=bit[i]; if(cur->nxt[num^1]) //因为要尽可能的大所以取相反的数字 cur=cur->nxt[num^1]; else cur=cur->nxt[num];// 如果没有相反的就只能走下去了 } return cur->val;}void desinfo(node *cur) //删除字典树释放内存{ for (int i=0; i<2; ++i) if(cur->nxt[i]) desinfo(cur->nxt[i]); delete cur;}int main(){ int T,val,s; int n,m; scanf("%d",&T); for (int q=1; q<=T; ++q) { root =new node(); scanf("%d%d",&n,&m); for (int i=0; i<n; ++i) { scanf("%d",&val); update(val); } printf("Case #%d:\n",q); for (int i=0; i<m; ++i) { scanf("%d",&s); printf("%d\n",query(s)); } desinfo(root); } return 0;}
阅读全文
0 0
- 【01字典树】HDU 4825 Xor Sum
- HDU 4825 Xor Sum 01字典树
- HDU 4825 Xor Sum (01字典树)
- HDU 4825 Xor Sum(01字典树)
- HDU 4825 Xor Sum 【01字典树】
- hdu Xor Sum 4825 01字典树
- HDU-Xor Sum(01字典树)
- HDU 4825 Xor Sum (01字典树)
- HDU 4825 Xor Sum(经典01字典树)
- HDU 4825 Xor Sum(01字典树+异或)
- HDU 4825 Xor Sum(01字典树)
- hdu 4825 Xor Sum(01字典树)
- HDU 4825:Xor Sum(01字典树+贪心)
- hdu 4825 Xor Sum(字典树)
- hdu 4825 Xor Sum(字典树)
- HDU-4825-Xor Sum【字典树】
- Hdu 4825 Xor Sum【字典树+贪心】
- hdu 4825 Xor Sum(字典树)
- 设计模式之适配器设计
- Windbg核心调试之dump分析
- SPI子系统分析之一:框架
- Java log4j详细教程
- 第三周 【项目4
- HDU 4825 Xor Sum(01字典树)
- ConstraintLayout 优秀博客
- 基础概率公式汇总
- vue2几种不同组件(页面)间传值的方式
- Docker和孤儿进程、僵尸进程
- 第3周项目3-求集合并集
- [BZOJ]3226: [Sdoi2008]校门外的区间 线段树
- 数学笔记8——最值问题
- 机器学习技法课程学习笔记1 -- Linear Support Vector Machine