【codevs3031】最富有的人(字典树)
网址:http://codevs.cn/problem/3031/
这是蒟蒻写的第一道字典树……听说出市选题的神犇要出字符串,于是就赶紧滚去学了学(然而高精度算字符串算法?)
简单来说,字典树就是把一坨字符串按照字典序储存起来。然而,直接把字符串排序太浪费空间,而且时间效率也不佳。于是,我们就需要字典树了。
字典树的大致存储方式就是:
假设有5个字符串:a,abc,ab,acb,abd,字典树的存储方式就是把两个字符串相同的前缀合并起来(比如abc和abd有公共的前缀ab,那么就把两个ab合并起来,把剩下的b和c作为ab的两个分支)。
具体可以看图:(其中每条边旁边的字母表示这条边代表的字符,红色的节点代表有字符串在这里结束,从根到红色节点的路径上的字符串起来就是它代表的字符串)

然而,我们知道了字典树,这道题应该怎么做呢?如果只是单纯的排序,用快排就能完成,为什么还要用字典树呢?
我们分析一下题目。题目要求集合中任意数对中最大的xor值,xor的运算规则是相同则0,不同则1,并且不同位之间的运算结果不会相互影响。所以,我们可以发现,如果在高位的值相同的情况下,选择让两个数的这一位取不同的数一定比取相同的数更优(1+2+4+……+2^(n-1)=2^n-1<2^n)。所以我们可以利用字典数的树结构,在树上用两个指针爆搜,如果有不同的路可以走就走不同的路,否则再走相同的路。
于是这道题就完了。。。
代码:
uses math;
type tree=record
c:array[..]of longint;
flag:boolean;
end;
var n,m,i,j,k,p:longint;
num:array[..]of longint;
a:array[..]of tree;
procedure add(dep,now:longint);
begin
if dep= then begin
a[now].flag:=true; exit;
end;
if a[now].c[num[dep]]= then begin
inc(m); a[now].c[num[dep]]:=m;
end;
add(dep+,a[now].c[num[dep]]);
end;
function dfs(dep,x,y:longint):longint;
var ans,i,j:longint;
begin
if dep= then exit();
ans:=-;
if(a[x].c[]>)and(a[y].c[]>)then
ans:=max(ans,dfs(dep+,a[x].c[],a[y].c[]));
if(a[x].c[]>)and(a[y].c[]>)then
ans:=max(ans,dfs(dep+,a[x].c[],a[y].c[]));
if(ans>=)then exit(ans+<<(-dep));
if(a[x].c[]>)and(a[y].c[]>)then
ans:=max(ans,dfs(dep+,a[x].c[],a[y].c[]));
if(a[x].c[]>)and(a[y].c[]>)then
ans:=max(ans,dfs(dep+,a[x].c[],a[y].c[]));
exit(ans);
end;
begin
read(n); m:=;
for i:= to n do begin
read(k);
for j:= to do begin
num[-j]:=k and ;
k:=k>>;
end;
add(,);
end;
writeln(dfs(,,));
end.
codevs3031
【codevs3031】最富有的人(字典树)的更多相关文章
- 字典树+博弈 CF 455B A Lot of Games(接龙游戏)
题目链接 题意: A和B轮流在建造一个字,每次添加一个字符,要求是给定的n个串的某一个的前缀,不能添加字符的人输掉游戏,输掉的人先手下一轮的游戏.问A先手,经过k轮游戏,最后胜利的人是谁. 思路: 很 ...
- 字典树 - A Poet Computer
The ACM team is working on an AI project called (Eih Eye Three) that allows computers to write poems ...
- 字典树trie的学习与练习题
博客详解: http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html http://eriol.iteye.com/bl ...
- zoj 1109 zoj 1109 Language of FatMouse(字典树)
好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组.完全按照自己按照自己的想法打的,没有参考如何被人的代码.调试了一天,居然最后错在一个小问题上, ...
- Codeforces 455B A Lot of Games(字典树+博弈)
题目连接: Codeforces 455B A Lot of Games 题目大意:给定n.表示字符串集合. 给定k,表示进行了k次游戏,然后是n个字符串.每局開始.字符串为空串,然后两人轮流在末尾追 ...
- (step5.1.2)hdu 1305(Immediate Decodability——字典树)
题目大意:输入一系列的字符串,判断这些字符串中是否存在其中的一个字符串是另外一个字符串的前缀.. 如果是,输出Set .. is not immediately decodable 否则输出Set . ...
- 从Trie树(字典树)谈到后缀树
转:http://blog.csdn.net/v_july_v/article/details/6897097 引言 常关注本blog的读者朋友想必看过此篇文章:从B树.B+树.B*树谈到R 树,这次 ...
- 海量数据处理之Tire树(字典树)
参考博文:http://blog.csdn.net/v_july_v/article/details/6897097 第一部分.Trie树 1.1.什么是Trie树 Trie树,即字典树,又称单词查找 ...
- hdu1251 && hud 1247 (字典树)
hdu1251 题目 这道题,主要是在主函数的输入输出上犹豫了. #include<stdio.h> #include<cstring> #include<iostrea ...
随机推荐
- 【BZOJ2150】部落战争 最小流
[BZOJ2150]部落战争 Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇, ...
- Young Maids
E - Young Maids Time limit : 2sec / Memory limit : 256MB Score : 800 points Problem Statement Let N ...
- Fennec VS. Snuke
Fennec VS. Snuke Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement Fenne ...
- Web开发之容器
Web开发之容器 主题 Servlet容器.Web容器.应用服务器 参考资料 Servlet容器.Web容器.应用服务器 Servlet容器的主要任务是管理Servlet的生命周期 ...
- SqlCommand对象-Transaction事务的使用
using (SqlConnection connection = new SqlConnection(connStr)) { SqlCommand sqlcmd = new SqlCommand() ...
- spring多数据源事务配置
项目中遇到多数据源问题, 对于每个数据源需要单独完成事务控制, 这里记录下具体实现方法 在spring配置文件中 定义两个数据源 <!-- 数据源定义(spring-jndi) --> ...
- 插叙LTE
- JS获取短信验证码60秒
<script language="javascript"> function get_mobile_code(){ $.post("{{ ...
- mac开发环境爬坑记(搭建php+nginx+mysql+redis+laravel+git+phpstorm)
题外话:前几天,终于以原价一半的价格,将我那台15版mbp在bbs上卖了出去.之所以用了“终于”这个词儿,是我一直迟迟没有下定决心卖掉它,可眼瞅着再不卖掉,又要掉价,况且我的新电脑,也终于下来了. 话 ...
- Python3.6全栈开发实例[001]
检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. li = [11,22,33,44,55,66,77,88,99,000,111,222] def func1(l ...