2014 百度之星 1003 题解 Xor Sum
Xor Sum
Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包括一个正整数 S ,之后 Zeus 须要在集合其中找出一个正整数 K ,使得 K 与 S 的异或结果最大。 Prometheus 为了让 Zeus 看到人类的伟大,随即允许 Zeus 能够向人类求助。你能证明人类的智慧么?
输入包括若干组測试数据,每组測试数据包括若干行。
输入的第一行是一个整数T(T < 10),表示共同拥有T组数据。 每组数据的第一行输入两个正整数N,M(<1=N,M<=100000)。接下来一行,包括N个正整数,代表 Zeus 的获得的集合,之后M行,每行一个正整数S,代表 Prometheus 询问的正整数。 全部正整数均不超过2^32。
对于每组数据。首先须要输出单独一行”Case #?:”。当中问号处应填入当前的数据组数。组数从1開始计算。
对于每一个询问,输出一个正整数K,使得K与S异或值最大。
2
3 2
3 4 5
1
5
4 1
4 6 5 6
3
Case #1:
4
3
Case #2:
4
看起来非常easy的题目,由于使用暴力法的代码非常easy,可是这道题使用暴力法超时,所以就成为难题了。
题目应该使用Trie数据结构去解。并且是Trie的基本构建和搜索了。
和一般的Trie不同,就是不用26个分支了,这里仅仅有两个分支,那么就更加简单了。
我一直都不太喜欢杭电的OJ。就是由于他们的输入输出感觉不够智能。尾部多个换行符或者少个换行符都不成,一般OJ都无论这个推断答案的了。
并且本题使用自家写的IO也不行,浪费我不少时间。
我这道题是从高位到低位构建Trie的。也是从高位到低位搜索。并且树高是固定33. 搜索效率接近常数.
以下是收拾过的代码。带上释放内存,形成良好的编程习惯。
#include <stdio.h>
#include <stdlib.h>
#include <bitset>
using std::bitset; class XorSum1003_4
{
struct Node
{
Node *children[2];
explicit Node()
{
children[0] = NULL;
children[1] = NULL;
}
~Node()
{
if (children[0]) delete children[0];
if (children[1]) delete children[1];
}
};
struct Tree
{
Node *emRoot;
Tree()
{
emRoot = new Node;
}
~Tree()
{
if (emRoot) delete emRoot;
}
}; Tree *trie;
void insertNode(long long n)
{
bitset<33> bs = n;
Node *pCrawl = trie->emRoot;
for (int i = 32; i >= 0 ; i--)
{
if (!pCrawl->children[bs[i]])
{
pCrawl->children[bs[i]] = new Node;
}
pCrawl = pCrawl->children[bs[i]];
}
} long long serachXor(long long n)
{
bitset<33> bs = n;
bitset<33> ans;
Node *pCrawl = trie->emRoot;
for (int i = 32; i >= 0 ; i--)
{
if (bs[i])
{
if (pCrawl->children[0])
{
ans[i] = 0;
pCrawl = pCrawl->children[0];
}
else
{
ans[i] = 1;
pCrawl = pCrawl->children[1];
}
}
else
{
if (pCrawl->children[1])
{
ans[i] = 1;
pCrawl = pCrawl->children[1];
}
else
{
ans[i] = 0;
pCrawl = pCrawl->children[0];
}
}
}
return ans.to_ullong();
}
public:
XorSum1003_4() : trie(NULL)
{
int T, N, M;
scanf("%d", &T);
for (int i = 1; i <= T; i++)
{
if (trie) delete trie;
trie = new Tree; printf("Case #%d:\n", i); scanf("%d %d", &N, &M);
long long a, b;
for (int k = 0; k < N; k++)
{
scanf("%I64d", &a);
insertNode(a);
}
for (int k = 0; k < M; k++)
{
scanf("%I64d", &a);
b = serachXor(a);
printf("%I64d\n", b);
}
}
}
~XorSum1003_4()
{
if (trie) delete trie;
}
};
2014 百度之星 1003 题解 Xor Sum的更多相关文章
- 2014百度之星预赛(第二场)——Best Financing
2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...
- 2014百度之星第三题Xor Sum(字典树+异或运算)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- 2014百度之星资格赛—— Xor Sum(01字典树)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- 2014 百度之星 题解 1004 Labyrinth
Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...
- 2014百度之星资格赛——Disk Schedule
2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...
- 2014百度之星初赛第二场hdu 4831 Scenic Popularity
Scenic Popularity Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2014 百度之星题解 1002 - Disk Schedule
Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景. 磁盘 ...
- 2015 百度之星 1003 棋盘占领 dfs
棋盘占领 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_show ...
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
随机推荐
- 2015 Multi-University Training Contest 5 hdu 5352 MZL's City
MZL's City Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Python3 定时访问网页
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50358695 如果我有一组网站,想要定 ...
- mysql5.7官网直译SQL语句优化--select语句优化
8.2 sql语句优化 大致内容如下: 8.2.1:SELECT语句的优化 8.2.2:优化子查询,派生表和试图引用 8.2.3:优化INFORMATION_SCHEMA查询 8.2.4:优化数据改变 ...
- com.alibaba.fastjson.JSONPathException: expect '], but 'y'
今天遇到这样的一个错误 网上查找了各种资料,终于找到了报错的原因: String dataType = (String) JSONPath.eval(dataset.getSchema(), &quo ...
- C++实现页码数字统计
#include<iostream> #include<iomanip> #include<cstdlib> #include<ctime> #incl ...
- HTML5简单进度环插件
前几天做了一个进度条的插件.今天我用HTML5的arc做一个简单的进度环的插件. 代码演示 事实上非常easy的.相同,我们先用一个实例: 配置js代码 var setting = { id: &qu ...
- android的架构图
1.Applications 该层是Android应用程序层. 每一个应用必须利用android系统设计的应用框架(application framework)开发. 眼下的开发环境是eclipse ...
- node 命令行输入控件 prompt.js
function print(){ console.log.apply(console , arguments) } var step ,_lstStp ,_onConfirmInput ,_ ...
- apiCloud中Frame框的操作,显示与隐藏Frame
Frame是一层一层的概念, 有的位于上层,有的位于下层. 1.加载菜单 2.加载页面层 3.首页拆分出内容层,这个时候内容层位于页面层的上方,当点击其他页面的时候,内容层遮挡住了他们 解决方案一 判 ...
- java日期类型与字符串类型的相互转换
package cn.zwq.convert; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...