trie树——【吴传之火烧连营】
突然发现好像没有讲过一种叫做tire树的神奇东西。
问题描述:
题目描述
【题目背景】
蜀汉章武元年(221年),刘备为报吴夺荆州、关羽被杀之仇,率大军攻吴。吴将陆逊为避其锋,坚守不战,双方成对峙之势。蜀军远征,补给困难,又不能速战速决,加上入夏以后天气炎热,以致锐气渐失,士气低落。刘备为舒缓军士酷热之苦,命蜀军在山林中安营扎寨以避暑热。陆逊看准时机,命士兵每人带一把茅草,到达蜀军营垒时边放火边猛攻。蜀军营寨的木栅和周围的林木为易燃之物,火势迅速在各营漫延。蜀军大乱,被吴军连破四十余营。陆逊火烧连营的成功,决定了夷陵之战蜀败吴胜的结果。
【问题描述】
刘备带兵深入吴境,陆逊却避而不出,蜀军只得在山林中安营扎寨。而刘备在扎营时却犯了兵家大忌,将兵营排列成一条直线,远远看去,就像是一条串着珠子的链,美其名曰:链寨。如果吴军将领是一般人,那么这也许不算什么,而陆逊何许人也,他可是江东才子,能力不低于周瑜的一代儒将。他看到刘备这样排阵,心生一计,决定用火攻破阵。然而,火计除了要有风,选定引火点也非常重要,对于刘备的布阵,最佳引火点一定是n个兵营中的一个。而因为风水轮流转,每天的最佳引火点都不一样。我们给每个兵营定下一个固定不变的火攻值Ai,每天定下一个风水值K,对于每天的最佳引火点,显然是所有兵营中火攻值与风水值异或的结果最大的那一个兵营。然而,陆逊是个谨慎的人,他要观察时机,在m天中选定一个最佳的进攻的日期,为此他演算出了这m天每天的风水值,然后他希望你能够告诉他这m天每天最佳引火点的兵营编号。
输入
第一行n,m,代表有n个兵营,m天。
接下来一行有n个非负整数,代表这n个兵营的火攻值。
接下来一行有m个非负整数,代表这m天的风水值。
输出
输出共m行,每行输出一个整数,代表第m天最佳引火点的编号。
如果存在多个最佳引火点使得火攻值与风水值的异或值最小,请任意输出一组解即可。
样例输入
样例输出
提示
【样例解释】
对于第1天,由于4 xor 1=5, 4 xor 2=6, 4 xor 3=7,选择第3个引火点是最佳的。
对于第2天,由于5 xor 1=4, 5 xor 2=7, 5 xor 3=6,选择第2个引火点是最佳的。
【数据规模和约定】
对于30%数据,n<=1000,m<=1000
对于100%数据,n<=100000,m<=100000, 0<=k,ai<=2147483647
思路分析:
这是一道非常经典的trie树的题。那么trie树又是什么神奇东西呢?
假设我们有两个字符串abcba,abcac,我们可以把它放到一颗树上,这棵树的节点是字符串中的字母,字符串中的每以为都在树上代表了一层,这棵树的点并不是一开始就有的,而是我们通过不断添加字符串来拓展的。比如上面两个字符串,我们先将第一个字符串加入tire树,那么就构建出了一个5层的树第1层有一个节点a,第2层有一个节点b,第3层有一个节点c,第4层有一个节点b,第5层有一个节点a。那么我们应该如何加入abcac,对于第1个字符a,我们发现它已经在trie树中了,那么就走到第1层的节点a上,一直到字符c,我们都能这么做,但是第4个字符a,我们发现第3层的c节点的连边只有b而没有a,那么我们便在第四层新加入一个节点a,并将它和第三层的c节点连一条边,第5个字符b也是如此。
那么这题应该如何来做呢?
类似的,把读入的数的二进制加入trie树中,那么询问时,我们要尽量的走与询问数的二进制相反的点,因为这样异或之后就可以让那一位变成1,很简单不是吗?
代码实现:
var
map:array[1..8000000,0..1]of longint;
flag:array[1..8000000]of longint;
a:array[0..32]of 0..1;
i,j,k,n,m,x,tot:longint;
procedure add(x:longint);
var
i,u:longint;
begin
u:=1;
for i:=1 to 32 do
if map[u,a[i]]=0 then begin inc(tot); map[u,a[i]]:=tot; u:=tot; end
else u:=map[u,a[i]];
flag[u]:=x;
end;
function find:longint;
var
i,u:longint;
begin
u:=1;
for i:=1 to 32 do
if map[u,a[i]]=0 then u:=map[u,1-a[i]] else u:=map[u,a[i]];
exit(flag[u]);
end;
begin
read(n,m);
tot:=1;
for i:=1 to n do
begin
read(x);
fillchar(a,sizeof(a),0);
k:=32;
while x>0 do
begin
a[k]:=x mod 2;
x:=x div 2; dec(k);
end;
add(i);
end;
for i:=1 to m do
begin
read(x);
k:=32;
for j:=1 to 32 do a[j]:=1;
while x>0 do
begin
a[k]:=1-(x mod 2);
x:=x div 2; dec(k);
end;
writeln(find);
end;
end.
trie树——【吴传之火烧连营】的更多相关文章
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...
- 【动画】看动画轻松理解「Trie树」
Trie树 Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 以示区别 ...
- CF888G Xor-MST 生成树、分治、Trie树合并
传送门 第一次接触到Boruvka求最小生成树 它的原版本是:初始每一个点构成一个连通块,每一次找到每一个连通块到其他的连通块权值最短的边,然后合并这两个连通块.因为每一次连通块个数至少减半,所以复杂 ...
- python Trie树和双数组TRIE树的实现. 拥有3个功能:插入,删除,给前缀智能找到所有能匹配的单词
#coding=utf- #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(). ''' Python 字典 setdefault() ...
- loj517 计算几何瞎暴力(Trie树)
题目: https://loj.ac/problem/517 分析: 操作4比较特殊,我们先来分析下操作4 操作4相当于需要一个数据结构,使得里面的数据有序(这有很多选择) 结合操作1,操作4的“排序 ...
- Trie 树(字典树)
[动画]看动画轻松理解「Trie树」 读音 Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 ...
- 4.15 省选模拟赛 编码 trie树 前缀和优化建图 2-sat
好题 np. 对于20分 显然可以爆搜. 对于50分 可以发现每个字符串上的问号要么是0,要么是1.考虑枚举一个字符串当前是0还是1 这会和其他字符串产生矛盾. 所以容易 发现这是一个2-sat问题. ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 基于trie树的具有联想功能的文本编辑器
之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...
随机推荐
- 尝试MatCap类型shader
听说MatCap能在低端机上做出很漂亮的pbr效果,就尝试了一下. MatCap全称MaterailCapture,里面存的是光照信息,通过法线的xy分量去采样matcap,得到在该方向法线的光照信息 ...
- 【Gin-API系列】实现路由分组(七)
在之前的文章介绍中我们已经完成了一个API服务的全链路请求设计.调用方式可以看Test目录的代码 // src/test/request_test.go func TestAPI_Request(t ...
- 深入了解Netty【四】IO模型
引言 IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型.非阻塞式IO模型.IO复用模型.信号驱动式IO模型.异步IO模型. 因为学习Netty必不可少的要了解IO多 ...
- 关于移动端的文本框获取焦点时导致fixed或absolute定位的按钮被手机键盘顶上去的问题
var win_h = $(window).height();//关键代码 window.addEventListener('resize', function () { if($(window).h ...
- 答应我,用了这个jupyter插件,别再重复造轮子了
1 简介 在使用Python.R等完成日常任务的过程中,可能会经常书写同样或模式相近的同一段代码,譬如每次使用matplotlib绘制图像的时候可以在开头添加下面两行代码来解决中文乱码等显示问题: p ...
- 转载:Oracle常见字段类型
转载节选自:https://bbs.csdn.net/topics/220059184 数据类型 参数 描述 char(n) n=1 to 2000字节 定长字符串,n字节长,如果不指定长度,缺省为1 ...
- java 将本地文件或网络文件与base64互相转换
一:将网络文件转为Base64 将文件转为base64 public static String fileToBase64(String url){ int byteread = 0; String ...
- Python多行缩进反向缩进快捷键
1.Python增加缩进快捷键:Ctrl+Alt+] 或tab键或shift+tab键 2.Python减少缩进快捷键:Ctrl+Alt+[
- LongAccumulator类的BUG——reset方法并不能保证初始值正确赋值
LongAccumulator.reset方法并不能重置重置LongAccumulator的identity:初始值正确,使其恢复原来的初始值.当初始值为0是不会发生这个问题,而当我们设置初始值如1时 ...
- python根据密钥得到谷歌两步验证动态验证码
# coding=utf-8 import time import base64 import sys import hashlib import hmac import struct def goo ...