2014百度之星资格赛—— Xor Sum(01字典树)
Xor Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 0 Accepted Submission(s): 0
每组数据的第一行输入两个正整数N,M(<1=N,M<=100000),接下来一行,包括N个正整数。代表 Zeus 的获得的集合,之后M行。每行一个正整数S,代表 Prometheus 询问的正整数。全部正整数均不超过2^32。
对于每一个询问。输出一个正整数K。使得K与S异或值最大。
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct tire{__int64 w; //从根节点到该结点的struct tire *next[2]; //每一个节点以下可能有2个数,0和1
}tree,*tiretree; /* 字典树的存储结构 */
tiretree T;
void insert(__int64 a) //把a的32位二进制码插入到字典树中
{int i;tiretree q,p;q=T;for(i=31;i>=0;i--){if(!(a&1<<i)) //若为0就插入到第一个子结点,a的32位二进制码是按高位往地位从根节点到叶子结点存放的;{p=q->next[0];if(p==NULL) //假设该二进制数应该在的位置为空,则将二进制数插入到该位置{p=(tiretree)malloc(sizeof(tree));p->next[0]=NULL;p->next[1]=NULL;if(i==0) //若a结点达到叶子节点,就把a存到叶子结点中;p->w=a;elsep->w=0; //若为a的中间经过结点,则不赋值。即字典树中仅仅有叶子结点有数字。其余结点都为0;q->next[0]=p;}q=p;}else{p=q->next[1]; //若为1就插入到第二个子结点。if(p==NULL){p=(tiretree)malloc(sizeof(tree));p->next[0]=NULL;p->next[1]=NULL;if(i==0)p->w=a;elsep->w=0;q->next[1]=p;}q=q->next[1]; //假设该二进制应该在的位置不空。则继续比較下一个二进制}}
}
__int64 find(__int64 a) // 对于随意非负整数x,能够沿着树根往下贪心找到y,使得a异或y最大,复杂度为树的深度。
{ int i; tiretree q; q=T; for(i=31;i>=0;i--) { if(q->next[0]==NULL) q=q->next[1]; else if(q->next[1]==NULL) q=q->next[0]; else if((a&1<<i)==0) q=q->next[0]; else q=q->next[1]; } return q->w; } int main() { int n,i,p,TT,count=0; __int64 max,a,m,q; scanf("%d",&TT); while(TT--) { scanf("%d %d",&n,&p); delete(T); T=(tiretree)malloc(sizeof(tree)); //构造单个根结点 T->next[0]=NULL; T->next[1]=NULL; T->w=0; max=0; for(i=0;i<n;i++) { scanf("%I64d",&a); insert(a); //分别把集合中的每一个数插入到树中 } for(i=0;i<p;i++) { scanf("%I64d",&q); m=~q; //然后把要比較的数取反后,与字典树中存的数进行比較 if(i==0) printf("Case #%d:\n",++count); printf("%I64d\n",find(m)); } } return 0; }
2014百度之星资格赛—— Xor Sum(01字典树)相关推荐
- HDU4825 Xor Sum 01字典树(Tire Tree)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- 2014百度之星资格赛——Disk Schedule
2014百度之星资格赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中, ...
- 2014百度之星资格赛第一道Energy Conversion
Problem Description 魔法师百小度也有遇到难题的时候--现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力.过了许久,百小 ...
- [2014百度之星资格赛]
第一个问题: Energy Conversion Problem Description 魔法师百小度也有遇到难题的时候--如今.百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这样的魔 ...
- 2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)
Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2014 百度之星 资格赛 第一题 Energy Conversion 解题思路
本次比赛的资格赛似乎比以往来的要稍微难一点,但是整体来说,每道题想到解题思路都不是很难,但是在具体的代码编写过程中需要注意的细节尤为重要.下面先将第一题的题目贴出: [Time Limit: 2000 ...
- 2014百度之星资格赛 1001 Energy Conversion(递归)题意不解释
Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2014百度之星资格赛第二题
Disk Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 2014百度之星资格赛解题报告:能量变换
QAZ的能量变换 题目描述: 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久,百小度终于 ...
最新文章
- Eclipse to android
- 基于区块链的思考与创新应用实践
- RMAN backup recovery area 命令
- 几个预防并发搞垮下游服务的方法
- 写给新入职的毕业生们(二)
- Hadoop常见问题及解决方法
- python实现触摸精灵功能_FRIDA脚本系列(三)超神篇:百度AI“调教”抖音AI
- Linux之安装显卡驱动
- 用 WebGL 探索动画和交互技术(一个学习案例)
- python 客户端同构_同构python算法
- win7 按修改时间范围文件搜索
- numpy和pandas的操作
- Python使用天气网api接口获取天气数据
- picpick文字竖排了怎么变成横排
- oracle 信用检查,Oracle EBS 信用(Credit)额度(1)
- vst开启语音服务器,VST语音遥控器体验记
- BookReader
- mvn clean package是个什么鬼?
- 小米手机解bl锁正规方法!
- 建立第一个Power Apps程序(新手版)
热门文章
- pandas合并groupby_Pandas中级技巧-数据的灵活运算
- unity 打开项目路径无效_unity3d建立的文件有中文路径,现在新建了项目打不开了...
- python图片转动漫_python实现了照片转化为动漫模式
- 百度定位安卓6.0权限问题
- 画时序图软件 TimeGen 3.2 TimingDesigner 9.103 AndyTiming
- VB 二进制数据读写实例
- VB得到指定文件夹下的文件列表
- 又把锅甩给中国!苹果和解给了300多亿,但高通业绩预测并不乐观
- 特斯拉好事连连:自动驾驶新硬件性能提升10倍,两名新董事昨晚上任,股价涨5.6%...
- DeepMind去年亏损27亿元,同比扩大221%,谷歌说:继续烧