2014百度之星第三题Xor Sum(字典树+异或运算)
Xor Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 4445 Accepted Submission(s): 652
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
2
3 2
3 4 5
1
5
4 1
4 6 5 6
3
Sample Output
Case #1:
4
3
Case #2:
4
题解
本题数据量非常大,感觉直接暴力时间复杂度O(n*m)会超时。只是想到去年网赛有道题数据量也非常大直接暴力居然过了于是直接敲了敲,终于还是TLE了。
想到位操作运算符的通用思想,逐位处理,相应本题还是比較easy想到字典树的。Memory Limit: 132768/132768 K (Java/Others),提示能够尝试牺牲空间换取时间。直接字典树空间消耗为2^32,但本题数据相对此规模还是比較小的。一共n个数,总共32*n位。所以空间复杂度为O(n)。能够接受。先用原序列中的数按位建立字典树。然后将查找过程中用待询问数与0xffffffff异或XOR来在字典树上跑。终于找到的即为最大的。
如果按查询的XOR的某个分支不存在。则想还有一分支进行。这样答案可能变小,可是正确的。总的时间复杂度O(m*log(32))。常数能够不计。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; const int MAXN=100000*32+100;
__int64 tree[MAXN][2];
__int64 node[MAXN];
__int64 tot; void insert(__int64 a)
{
__int64 j;
int bit,dep=0;
for(j=31;j>=0;j--)
{
bit=((0x1<<j)&a)?0x1:0x0;
if(tree[dep][bit]==0)
{
tree[dep][bit]=tot++;
memset(tree[tree[dep][bit]], 0, sizeof(tree[tree[dep][bit]]));
}
dep=tree[dep][bit];
}
node[dep]=a;
} __int64 Solve(__int64 val)
{
__int64 j,bit;
int dep=0;
for(j=31;j>=0;j--)
{
bit=((0x1<<j)&val)?0x0:0x1;
if(tree[dep][bit])dep=tree[dep][bit];
else dep=tree[dep][bit^1];
}
return node[dep];
} int main()
{
int cas;
__int64 n,m,j,s,a;
int tag=0;
cin>>cas;
while(cas--)
{
tot=1;
scanf("%I64d%I64d",&n,&m);
memset(tree[0],0,sizeof(tree[0]));
while(n--)
{
scanf("%I64d",&a); insert(a);
}
printf("Case #%d:\n",++tag);
while(m--)
{
scanf("%I64d",&s);
printf("%I64d\n",Solve(s));
}
}
return 0;
}
2014百度之星第三题Xor Sum(字典树+异或运算)的更多相关文章
- HDU 4825 Xor Sum 字典树+位运算
点击打开链接 Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) ...
- HDU--4825 Xor Sum (字典树)
题目链接:HDU--4825 Xor Sum mmp sb字典树因为数组开的不够大一直wa 不是报的 re!!! 找了一下午bug 草 把每个数转化成二进制存字典树里面 然后尽量取与x这个位置上不相同 ...
- hdu 4825 xor sum(字典树+位运算)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- 2014年百度之星资格赛第三题Xor Sum
Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeu ...
- 2014年百度之星程序设计大赛 - 资格赛 第三题 Xor Sum
小记:艹蛋呢, 取long long的低30,32,34位都WA, 取31位才AC. .. 思路:依据求数组中两个数异或最大值.參考 代码: #include <stdio.h> #inc ...
- 2014百度之星第四题Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 2014百度之星预赛(第二场)——Best Financing
2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...
- 2014 百度之星 题解 1004 Labyrinth
Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...
- HDU 4825 Xor Sum (模板题)【01字典树】
<题目链接> 题目大意: 给定n个数,进行m次查找,每次查找输出n个数中与给定数异或结果最大的数. 解题分析: 01字典树模板题,01字典树在求解异或问题上十分高效.利用给定数据的二进制数 ...
随机推荐
- [置顶] 手把手教你iOS消息推送证书生成以及Push消息
iOS推送消息是许多iOS应用都具备的功能,今天在给应用加推送功能,在生成证书的过程中,发生了各种令人蛋痛的事.下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provi ...
- 关于yaf的控制器命名,一个纠结的问题(续)
以下方案缺少loader相关的步骤,明天补上!!! 前面写过一篇<关于yaf的控制器命名,一个纠结的问题>.没想到yaf群里面也有跟我遇到一样问题的人,分享下解决办法. 写完那篇博文后,我 ...
- HDU1584:蜘蛛牌(DFS)
Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么 ...
- hdu 4057 AC自己主动机+状态压缩dp
http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...
- MFC实现多风格真彩色大图标工具栏按钮
研究zlib库,想实现一个类似winrar功能的小东东,打开winrar界面看它的工具栏比较好看于是动手想做一个,当然资源也使用的是winrar附带的.下面是截图:真彩色(32位)32*32大图标工具 ...
- c++ :: 域操作符
c++ :: 域操作符 作用域:变量在程序中的起作用范围简单分为:全局作用域,局部作用域,语句作用域作用域优先级:范围越小优先级越高作用域运算符:"::" 如果希望在局部变量的作用 ...
- Jenkins: 使用Jenkins搭建持续集成(CI)环境
http://www.cnitblog.com/luckydmz/archive/2012/01/03/77007.html 首先从官网http://jenkins-ci.org/下载 Java We ...
- eclipse不能进入debug
首先说明一下.我肯定是以debug模式启动的.断点程序肯定能走到. 可是一点页面,程序就跳到class文件,而不是Java文件. 解决的方法是:window---preferences---tomca ...
- HDU 3853 期望概率DP
期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] , 右移:[x][y ...
- 更好的自动ssh登录
更好的自动ssh登录 解决~/.ssh/known_hosts 过期问题. bash + expect bash:ssh.sh #!/bin/bash help(){ echo "usage ...