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 ...
随机推荐
- Spring配置文件中指定init-method属性的作用
bean 配置文件属性 init-method 用于在bean初始化时指定执行方法,用来替代继承 InitializingBean接口.相关链接:https://www.cnblogs.com/Joe ...
- 【codeforces 812C】Sagheer and Nubian Market
[题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...
- 第十一章 Servlet MVC模式
内包含案例,基于jsp+servlet的:MVC模式计算器:MVC模式登陆 第十一章 Servlet MVC模式 模型-视图-控制器(model-view-controller),简称MVC.MVC是 ...
- SQLSERVER-存储过程知识点
原文链接:http://www.qeefee.com/article/000566 存储过程是一组预编译的SQL语句,它可以包含数据操纵语句.变量.逻辑控制语句等. 存储过程允许带参数: 输入参数:可 ...
- 安卓中经常使用控件遇到问题解决方法(持续更新和发现篇幅)(在textview上加一条线、待续)
TextView设置最多显示30个字符.超过部分显示...(省略号),有人说分别设置TextView的android:signature="true",而且设置android:el ...
- Android-Volley网络通信框架(自己定义Request 请求:实现 GsonRequest)
1.回想 上篇学习了android 通过 volley 网络通信框架 实现 请求图片的三种方法! 2.重点 (1)复习和熟悉 StringRequest ,JsonObjectRequest 方法 ( ...
- ubuntu 下的文件校验(md5、sha256)
在本地使用 md5sum/sha256sum 生成某待测文件的 hash 值,以跟标准文件的 hash 值做对比验证,确定经网络传输过程得到的文件是否真实无损.一般而言,hash 值如果一致,大概率上 ...
- 为什么不针对internal接口写单元测试?
测试驱动的开发(TDD,Test Driven Development)的核心理念,是要使得重构(refactoring)更为有效,而不是创建更多的测试. 对一个有着长生命周期的项目来讲,在它的第一个 ...
- web语义化理解
含义: Web语义化是指使用语义恰当的标签,使页面有良好的结构,页面元素有含义,能够让人和搜索引擎都容易理解. 为什么要web语义化?如今互联网都到了web2.0的时代了,HTML语言在不断的进化并发 ...
- BZOJ 4289: PA2012 Tax(最短路)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 755 Solved: 240[Submit][Status][Discuss] Descriptio ...