【JDFZOJ】最富有的人 Trie树+异或性质

#include <stdio.h>
int main()
{
	puts("转载请注明出处谢谢");
	puts("http://blog.csdn.net/vmurder/article/details/43446799");
}

题面:

最富有的人

Time Limit: 1 Sec  Memory Limit: 64 MB

Description

  你经过了一段时间的打工,老板带你来到了他的私人金库。

  在你的面前有n堆金子,老板要求你只能选择其中的两堆,而你的工资为这两堆金子价值的xor值,你想成为最富有的人,你就要做出最优的选择。

/*

  名词解释:

    xor运算,两个数的对应二进制位相同则答案的二进制该位为0,不同则为1,例如10的二进制表示为1010,5的二进制表示为101,15的二进制表示为1111,则10 xor 5 = 15,当然,xor运算满足交换律,即5 xor 10 = 15。

    xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不变,异或1则取反。

    xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。

    xor运算可以用于简单的加密。比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19961008作为密钥。1314520 xor 19961008 = 19176040,我就把19176040告诉MM。MM再次计算19176040
xor 19961008的值,得到1314520,于是她就明白了我的企图。

*/

Input

第一行包含一个正整数t,表示有t组数据。

每组数据的第一行包含两个正整数n,表示有n堆金子;

第二行包含n个正整数,表示每堆金子的价值。

Output

对于每组数据用一行输出。

每行包含一个正整数,表示能获得的最大工资。

Sample Input

251 2 3 4 5101 2 3 4 5 6 7 8 9 10

Sample Output

715

HINT

数据范围:

t<=10 2<=n<=100000 每堆金子数<=2^31-1

题解:随便乱搞

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 101000
#define LOGN 35
#define T 2
using namespace std;
struct Trie
{
	int son[N*LOGN][T],cnt;
	void init()
	{
		memset(son,0,sizeof son);
		cnt=0;
	}
	void insert(long long a)
	{
		int i,x=0,alp;
		for(i=31;i>=0;i--)
		{
			alp=(a>>i)&1;
			if(!son[x][alp])son[x][alp]=++cnt;
			x=son[x][alp];
		}
	}
	long long find(long long a)
	{
		int i,x=0,alp;
		long long ret=0;
		for(i=31;i>=0;i--)
		{
			alp=!((a>>i)&1);
			ret<<=1;
			if(son[x][alp])
			{
				x=son[x][alp];
				ret++;
			}
			else x=son[x][!alp];
		}
		return ret;
	}
}trie;
long long ans,x[N];
int n;
int main()
{
//	freopen("test.in","r",stdin);

	int i,j,k,g;
	scanf("%d",&g);
	while(g--)
	{
		trie.init(),ans=0;
		scanf("%d",&n);
		for(i=1;i<=n;i++)scanf("%lld",&x[i]),trie.insert(x[i]);
		for(i=1;i<=n;i++)ans=max(ans,trie.find(x[i]));
		printf("%lld\n",ans);
	}
	return 0;
}
时间: 2024-08-30 05:53:11

【JDFZOJ】最富有的人 Trie树+异或性质的相关文章

【POJ3764】The xor-longest Path Trie树+异或性质

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43486733"); } 题意: 多组数据. 给你一颗树, 然后求一条最长异或路径, 异或路径长度定义为两点间简单路径上所有边权的异或和. 题解: 首先无根树转有根树再在树上跑一遍算出每个点到根的异或和. 然后两点间异或路径长度就是a[i]*

HDU 4825 Trie树 异或树!

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 2403    Accepted Submission(s): 1041 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Ze

【codevs3031】最富有的人[字典树]

网址:http://codevs.cn/problem/3031/ 这是蒟蒻写的第一道字典树--听说出市选题的神犇要出字符串,于是就赶紧滚去学了学(然而高精度算字符串算法?) 简单来说,字典树就是把一坨字符串按照字典序储存起来.然而,直接把字符串排序太浪费空间,而且时间效率也不佳.于是,我们就需要字典树了. 字典树的大致存储方式就是: 假设有5个字符串:a,abc,ab,acb,abd,字典树的存储方式就是把两个字符串相同的前缀合并起来(比如abc和abd有公共的前缀ab,那么就把两个ab合并起

Trie树(字典树)(1)

Trie树.又称字典树,单词查找树或者前缀树,是一种用于高速检索的多叉树结构. Trie树与二叉搜索树不同,键不是直接保存在节点中,而是由节点在树中的位置决定. 一个节点的全部子孙都有同样的前缀(prefix),也就是这个节点相应的字符串,而根节点相应空字符串.普通情况下.不是全部的节点都有相应的值,仅仅有叶子节点和部分内部节点所相应的键才有相关的值. A trie, pronounced "try", is a tree that exploits some structure in

Trie树的C++实现

先给出LintCode的题目:实现Trie树 Trie树就是字典树,用在搜索引擎如百度搜索词条,还比如说之前DNS域名解析系统搜索根据域名搜索IP.总之,是棵树,根据字符串搜索某一节点,同时就可获得节点存储的信息了. Trie树的一般性质如下: 1.根节点不包含字符,除根节点外每一个节点都只包含一个字符. 2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串. 3.每个节点的所有子节点包含的字符都不相同. 那么既然是树,既然需要和字符串匹配,那么树的节点怎么定义?我们可以这样分

数据结构之Trie树

1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tri:/ "tree",也有人读为/tra?/ "try". Trie树可以利用字符串的公共前缀来节约存储空间.如下图所示,该trie树用10个节点保存了6个字符串tea,ten,to,in,inn,int: 在该trie树中,字符串in,inn和int的公共前缀是&qu

Trie树详解

1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/tra?/ “try”.Trie树可以利用字符串的公共前缀来节约存储空间.如下图所示,该trie树用10个节点保存了6个字符串tea,ten,to,in,inn,int: 在该trie树中,字符串in,inn和int的公共前缀是“in”,因此可以只存储一份“in”以节

信息检索——初识Trie树

1.概述 Trie树( /tri:/ ),又称前缀树.字典树,是种快速检索的多叉树结构, Trie树的基本性质可以归纳为: (1)根节点不包含字符,除根节点意外每个节点只包含一个字符. (2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串. (3)每个节点的所有子节点包含的字符串不相同. 2.Trie基本实现 基本操作包括插入.删除.查找等. 考虑到通常用于字典等内存较大的情况,应该加入序列化,分割等操作. 3.应用 接触这一数据结构是因为分词处理中的字典存储问题,对这一问

字典树Trie树

一.字典树 字典树--Trie树,又称为前缀树(Prefix Tree).单词查找树或键树,是一种多叉树结构. 上图是一棵Trie树,表示了关键字集合{"a", "to", "tea", "ted", "ten", "i", "in", "inn"} .从上图可以归纳出Trie树的基本性质: 1. 根节点不包含字符,除根节点外的每一个子节点都包含一