Xor Sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)

Total Submission(s): 0    Accepted Submission(s): 0

Problem Description

Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问。每次询问中包括一个正整数 S ,之后 Zeus 须要在集合其中找出一个正整数 K ,使得 K 与 S 的异或结果最大。Prometheus 为了让 Zeus 看到人类的伟大。随即允许 Zeus 能够向人类求助。你能证明人类的智慧么?
 
Input

输入包括若干组測试数据,每组測试数据包括若干行。 输入的第一行是一个整数T(T < 10),表示共同拥有T组数据。

每组数据的第一行输入两个正整数N,M(<1=N,M<=100000),接下来一行,包括N个正整数。代表 Zeus 的获得的集合,之后M行。每行一个正整数S,代表 Prometheus 询问的正整数。全部正整数均不超过2^32。

 
Output

对于每组数据,首先须要输出单独一行”Case #?:”。当中问号处应填入当前的数据组数,组数从1開始计算。

对于每一个询问。输出一个正整数K。使得K与S异或值最大。

 
Sample Input

3 2 
3 4 5 
5
4 1
4 6 5 6 
3
 
Sample Output

Case #1: 
Case #2: 
4
 
题解:把集合中的每个数。都存放到深度为32的01字典树。左结点为0。右结点为1;然后询问数s取反与字典树中的存的数比   较找出最大异或数;
 对于随意非负整数x。能够沿着树根往下贪心找到y。使得a异或y最大,复杂度为树的深度。
以下为代码实现
#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;
else
p->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;
else
p->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字典树)的更多相关文章

  1. Xor Sum 01字典树 hdu4825

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  2. HDU-4825 Xor Sum,字典树好题!

    Xor Sum 一遍A了之后大呼一声好(keng)题!debug了两小时~~~~百度之星资格赛,可以. 题意:给你一个n个元素的数组,m次查询,每次输入一个数k要求从数组中找到一个数与k异或值最大,输 ...

  3. HDU 4825 Xor Sum(字典树)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 这道题更明确的说是一道01字典树,如果ch[u][id^1]有值,那么就向下继续查找/ ...

  4. 2014百度之星资格赛——Disk Schedule

    2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...

  5. HDU-4825 Xor Sum(字典树求异或最大值)

    题目链接:点此 我的github地址:点此 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整 ...

  6. HDU4825 Xor Sum(字典树解决最大异或问题)

    Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整 ...

  7. 2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. 2014百度之星资格赛 1004:Labyrinth(DP)

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. NBUT 1525 Cow Xor(01字典树+前缀思想)

    [1525] Cow Xor 时间限制: 2000 ms 内存限制: 65535 K 问题描述 农民约翰在喂奶牛的时候被另一个问题卡住了.他的所有N(1 <= N <= 100,000)个 ...

随机推荐

  1. 解决was6版本号过期问题

    原创作品.出自 "深蓝的blog" 博客,欢迎转载.转载时请务必注明出处.否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...

  2. HDU 3756

    很容易就想到把三维转化成了二维,求出点离Z轴的距离,把这个距离当成X坐标,Z轴当Y坐标,然后就变成了求一个直角三角形覆盖这些点 像上一题一样,确定斜率直线的时候,必定是有一点在线上的.于是,可以把直线 ...

  3. Linux中在主机上实现对备机上文件夹及文件的操作的C代码实现

    需求描写叙述 编敲代码.完毕在主机上实现对备机上文件夹及文件的操作. 比如,主机为A,备机为B,要求编写的程序运行在A机上,该程序实如今B机上创建文件文件夹及复制文件的操作. 需求分析 我们先不考虑用 ...

  4. Mina airQQ聊天 client篇(三)

    开发工具 (FlashBuilder4.7) 程序类型(Adobe Air) Flex Air做的桌面程序,效果还挺好看的.最主要是Socket这一块,它也是异步的,而且在Flex中的事件机制比較强大 ...

  5. 如何用写js弹出层 ----2017-03-29

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. BZOJ 3720 树分块

    借鉴了别人的代码-- //By SiriusRen #include <cmath> #include <cstdio> #include <cstring> #i ...

  7. ZBrush 4R7中为笔刷设置快捷键

    为了便于雕刻.提高雕刻速度,ZBrush®不仅很人性化地设计了自定义笔刷,用户还可以自行设置笔刷快捷键,步骤如下. ZBrush 4R8下载:http://wm.makeding.com/iclk/? ...

  8. VMware虚拟机共享文件夹

    安装好虚拟文件夹后,第二次开机时发现/mnt/hgfs目录下找不到共享的文件夹,原因是vmfg-fuse服务没有开启. 在root的配置文件中添加如下代码,设置开机自启: /usr/bin/vmhgf ...

  9. 使用短信猫读取短信java代码

    短信猫简单配置:https://www.cnblogs.com/Big-Boss/p/9699880.html 测试发送短信代码:https://www.cnblogs.com/Big-Boss/p/ ...

  10. luogu P3387 【模板】缩点_拓扑排序

    还是很好些的. Code: #include <stack> #include <cstdio> #include <algorithm> #include < ...