2014百度之星第三题Xor Sum(字典树+异或运算)「建议收藏」

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;
}

 

 


 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116591.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html5表格内容怎么居中_html表格上下居中

    html5表格内容怎么居中_html表格上下居中回答:IE6/7及IE8混杂模式中,text-align:center可以使块级元素也居中对齐。其他浏览器中,text-align:center仅作用于行内内容上。解决这个问题比较好的方式,就是为所有需要相对父容器居中对齐的块级元素设置“margin-left:Auto;margin-right:Auto”。但这个方式IE6/IE7/IE8的混杂模式中不支持,所以还要设置父容器的”text…

    2022年9月14日
    0
  • 数字电路实验(一)——译码器

    数字电路实验(一)——译码器1、实验步骤:异或门过程1、 新建,编写源代码。(1).选择保存项和芯片类型:【File】-【newprojectwizard】-【next】(设置文件路径+设置projectname为【C:\Users\lenovo\Desktop\笔记\大二上\数字电路\实验课\实验一\异或门】)-【next】(设置文件名【gg】)-【next】(设置芯片类型为【cyclone-EP1CT144C…

    2022年7月12日
    16
  • pytest的使用_调用方法的具体调用格式为

    pytest的使用_调用方法的具体调用格式为Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月31日
    2
  • JS刷新当前页面的方法总结

    JS刷新当前页面的方法总结一、刷新页面方法介绍1.reload()该方法强迫浏览器刷新当前页面。语法:location.reload([bForceGet])参数:bForceGet,可选参数,默认为false,从客户端缓存里取当前页。true,则以GET方式,从服务端取最新的页面,相当于客户端点击F5(“刷新”)reload()方法用于重新加载当前文档。如果该方法没有规定参数,…

    2022年7月12日
    17
  • C语言中按位取反_数组按位取反

    C语言中按位取反_数组按位取反与运算:&两者都为1为1,否则为01&1=1, 1&0=0, 0&1=0, 0&0=0或运算:|两者都为0为0,否则为11|1=1, 1|0=1, 0|1=1,0|0=0非运算:~1取0,0取1~1=0,~0=1~(10001)=01110异或运算两者相等为0,不等为11^1=0,

    2022年8月15日
    9
  • 软件工程期末试题及答案(史上最全)

    软件工程期末试题及答案(史上最全)软件工程期末试题及答案1.开发瀑布模型中的软件定义时期各个阶段依次是:(B)A)可行性研究,问题定义,需求分析。B)问题定义,可行性研究,需求分析。C)可行性研究,需求分析,问题定义。D)以上顺序都不对。(软件开发时期:概要设计、详细设计、软件实现、软件测试)2.可行性研究主要从以下几个方面进行研究:(A)A)技术可行性,经济可行性,操作可行性。B)技术可行性,经济可行性,系统可行性。C)经济可行性,系统可行性,操作可行性。D)经济可行性,系统可行性,时间可行性。..

    2022年9月2日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号