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
  1.  
Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问。每次询问中包括一个正整数 S ,之后 Zeus 须要在集合其中找出一个正整数 K ,使得 K 与 S 的异或结果最大。Prometheus 为了让 Zeus 看到人类的伟大。随即允许 Zeus 能够向人类求助。你能证明人类的智慧么?
 
Input
  1.  
输入包括若干组測试数据,每组測试数据包括若干行。 输入的第一行是一个整数T(T < 10),表示共同拥有T组数据。

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

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

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

 
Sample Input
  1.  
3 2 
3 4 5 
5
4 1
4 6 5 6 
3
 
Sample Output
  1.  
Case #1: 
Case #2: 
4
 
题解:把集合中的每个数。都存放到深度为32的01字典树。左结点为0。右结点为1;然后询问数s取反与字典树中的存的数比   较找出最大异或数;
 对于随意非负整数x。能够沿着树根往下贪心找到y。使得a异或y最大,复杂度为树的深度。
以下为代码实现
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<stdlib.h>
  4. using namespace std;
  5. typedef struct tire{
  6. __int64 w; //从根节点到该结点的
  7. struct tire *next[2]; //每一个节点以下可能有2个数,0和1
  8. }tree,*tiretree; /* 字典树的存储结构 */
  9. tiretree T;
  10. void insert(__int64 a) //把a的32位二进制码插入到字典树中
  11. {
  12. int i;
  13. tiretree q,p;
  14. q=T;
  15. for(i=31;i>=0;i--)
  16. {
  17. if(!(a&1<<i)) //若为0就插入到第一个子结点,a的32位二进制码是按高位往地位从根节点到叶子结点存放的;
  18. {
  19. p=q->next[0];
  20. if(p==NULL) //假设该二进制数应该在的位置为空,则将二进制数插入到该位置
  21. {
  22. p=(tiretree)malloc(sizeof(tree));
  23. p->next[0]=NULL;
  24. p->next[1]=NULL;
  25. if(i==0) //若a结点达到叶子节点,就把a存到叶子结点中;
  26. p->w=a;
  27. else
  28. p->w=0; //若为a的中间经过结点,则不赋值。即字典树中仅仅有叶子结点有数字。其余结点都为0;
  29. q->next[0]=p;
  30. }
  31. q=p;
  32. }
  33. else
  34. {
  35. p=q->next[1]; //若为1就插入到第二个子结点。
  36. if(p==NULL)
  37. {
  38. p=(tiretree)malloc(sizeof(tree));
  39. p->next[0]=NULL;
  40. p->next[1]=NULL;
  41. if(i==0)
  42. p->w=a;
  43. else
  44. p->w=0;
  45. q->next[1]=p;
  46. }
  47. q=q->next[1]; //假设该二进制应该在的位置不空。则继续比較下一个二进制
  48. }
  49. }
  50. }
  51. __int64 find(__int64 a) // 对于随意非负整数x,能够沿着树根往下贪心找到y,使得a异或y最大,复杂度为树的深度。
  52.  
  53. {
  54. int i;
  55. tiretree q;
  56. q=T;
  57. for(i=31;i>=0;i--)
  58. {
  59. if(q->next[0]==NULL)
  60. q=q->next[1];
  61. else
  62. if(q->next[1]==NULL)
  63. q=q->next[0];
  64. else
  65. if((a&1<<i)==0)
  66. q=q->next[0];
  67. else
  68. q=q->next[1];
  69. }
  70. return q->w;
  71. }
  72. int main()
  73. {
  74. int n,i,p,TT,count=0;
  75. __int64 max,a,m,q;
  76. scanf("%d",&TT);
  77. while(TT--)
  78. {
  79. scanf("%d %d",&n,&p);
  80. delete(T);
  81. T=(tiretree)malloc(sizeof(tree)); //构造单个根结点
  82. T->next[0]=NULL;
  83. T->next[1]=NULL;
  84. T->w=0;
  85. max=0;
  86. for(i=0;i<n;i++)
  87. {
  88. scanf("%I64d",&a);
  89. insert(a); //分别把集合中的每一个数插入到树中
  90. }
  91. for(i=0;i<p;i++)
  92. {
  93. scanf("%I64d",&q);
  94. m=~q; //然后把要比較的数取反后,与字典树中存的数进行比較
  95. if(i==0)
  96. printf("Case #%d:\n",++count);
  97. printf("%I64d\n",find(m));
  98. }
  99. }
  100. return 0;
  101. }

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. Android 四大组件学习之BroadcastReceiver四

    本节学习系统中特殊的广播接收者. 我们前面几节不是说了,当广播接受者一旦注冊到系统中,当系统发送的广播和你注冊的广播的action匹配时,系统就会启动广播接收者所在的进程.除非用户手动停止广播接收者所 ...

  2. UVA - 11722 Joining with Friend 几何概率

                            Joining with Friend You are going from Dhaka to Chittagong by train and you ...

  3. php5.5安装笔记

    这次没想到本来很简单的php编译,没想到遇到那么多问题.再此记录一下. 1.php5.5编译安装主要有一个难点,就是GD库的问题,因为php5.5的GD库必须是2.1以上的版本哦 原来都是用的gd2. ...

  4. OzymanDNS 使用——perl 5.22没有成功。。。

    最初官方的代码没有找到,但是发现github里貌似有: git clone https://github.com/splitbrain/dnstunnel.git 源码是perl写的,需要安装一些pe ...

  5. 使用CNN做文本分类——将图像2维卷积换成1维

    使用CNN做文本分类 from __future__ import division, print_function, absolute_import import tensorflow as tf ...

  6. 【POJ 1704】 Georgia and Bob

    [题目链接] http://poj.org/problem?id=1704 [算法] 阶梯博弈 [代码] #include <algorithm> #include <bitset& ...

  7. NEU2016年一月月赛回顾

    月赛传送门 http://acm.neu.edu.cn/hustoj/contest.php?cid=1066 月赛已经结束十天了...才把题目补完真是大失误... 茅巨巨四天前就补完了,,,总结写得 ...

  8. 【转】Docker基础

    一.简介 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的CGroup.Namespace.Union FS等技术实现的一种系统级虚拟化技术. 特性 更高效的利用系统资源: ...

  9. 【转】在IIS上部署你的ASP.NET Core项目

    概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kest ...

  10. 几个月来使用mobx代替redux的一些总结

    遇到的一些小坑 React组件内部想要调用store里的action方法,得如下图,否则不会调用(这个现在看来好像不对,待重新检验) 而不能如下图 组件中调用改变store的action后,状态变化并 ...