hdu - 4825 Xor Sum 01字典树

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825

题意:对于每一个测试样例,给你n个数,然后m个询问,每个询问给你一个数x,要求你给出n个数中哪个数与x的异或和最大。

思路:考虑在二进制下对每一位进行贪心,从高位到低位,在最暴力的做法下,设有一个集合内包含了给定的n个数,从x的最高位开始,如果该位为1,则将集合中对应位为0的数删去,如果删完后集合为空,则不进行删除操作,如果该位为0,操作类似。按位从左往右遍历,最后集合中的数即为答案。

但显然这种做法的时间复杂度是此题不能接受的,那我们该如何优化这种做法呢?如果你足够聪明或者接触过字典树的话,那么可以想到用字典树来加速上述暴力算法:上述算法中的按照对应位的值来进行筛选的操作即对应字典树中的节点的移动操作,而删除操作已经在移动的同时完成了,因此可以较快地完成询问操作。

代码:

#include 
#include 

using namespace std;

typedef unsigned int uint;

int tot=1, trie[3200020][2];

void insert(uint x)
{
	uint p = 1, t;
	for(int i = 31; i >= 0; --i){
		t = ((uint)1<= 0; --i){
		t = ((uint)1<>T;
	for(int f = 1; f <= T; ++f){
		tot = 1;
		memset(trie, 0, sizeof trie);
		cin>>n>>m;
		for(int i = 0; i < n; ++i){
			cin>>t;
			insert(t);
		}
		cout<<"Case #"<>t;
			cout<

 

你可能感兴趣的:(字典树)