
数据结构-字典树
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
hdu 4825 Xor Sum(字典树)
题目链接:hdu 4825 Xor Sum题目大意:中文题。解题思路:将给定得数按照二进制建成一颗字典树,每一层分别对应的各个位数上的01状态。然后每一次查询,如果对应位置为0,则要往1的方向走,如果是1,则要往0的方向走。但是要注意,走的前提是对应分支是存在的。#include #include #include using namespace std;//type原创 2014-05-21 23:20:19 · 3156 阅读 · 2 评论 -
hdu 2072 单词数(字典树)
题目链接:hdu 2072 单词数题目大意:略。解题思路:建字典树,有多少个单词节点即有多少个不同的单词。#include #include #include using namespace std;const int maxn = 1000005;const int sigma_size = 26;struct Tire { int sz;原创 2014-10-29 21:14:41 · 886 阅读 · 0 评论 -
LightOJ 1129 - Consistency Checker(字典树)
题目链接:LightOJ 1129 - Consistency Checker题目大意:给定若干个字符串,判断是否存在前缀。解题思路:字典树的简单应用。#include #include #include using namespace std;const int maxn = 10005;const int sigma_size = 10;struct Ti原创 2014-10-30 23:29:52 · 1178 阅读 · 0 评论 -
hdu 4757 Tree(可持久化字典树)
题目链接:hdu 4757 Tree题目大意:给定一棵树,每个节点有一个值,现在有Q次询问,每次询问u到v路径上节点值与w亦或值的最大值。解题思路:刚开始以为是树链剖分,其实树链剖分只是用来求LCA(可以不用树链剖分)。可持久化字典树,在每次插入的同时,不修改原先的节点,而是对所有修改的节点复制一个新的节点,并且在新的节点上做操作,这样做的目的是能够获取某次修改原创 2014-10-30 18:27:49 · 3954 阅读 · 0 评论 -
poj 1816 Wild Words(字典树+DFS)
题目链接:poj 1816 Wild Words题目大意:给定N个模板,即正则表达式,然后每次有一个询问串,输出能被哪些模板匹配。解题思路:对模板建立字典树,然后每次询问即在字典树做DFS搜索,注意'*'的情况,可以匹配一个和多个,所以在结尾的时候要注意。并且,模板串有重复的情况。#include #include #include #include usin原创 2014-10-30 18:40:29 · 1116 阅读 · 0 评论 -
LightOJ 1224 - DNA Prefix(字典树)
LightOJ 1224 - DNA Prefix题目大意:给定若干个字符串,找到一个前缀,前缀长度出现次数最大值。解题思路:对字符串集合建立字典树,然后遍历一遍,每个节点等于depval。#include #include #include using namespace std;const int maxn = 50005 * 50;const int sigma原创 2014-10-30 23:36:07 · 1277 阅读 · 0 评论 -
hdu 1075 What Are You Talking About(字典树)
题目链接:hdu 1075 What Are You Talking About题目大意:给定若干个字符串的映射,要求输出给定字符串的原串,即可以用映射串代替的均要替换。解题思路:对被映射串建立字典树,然后单词节点记录的是对应串映射串位置。然后对于需要翻译的字符串,逐个处理处单词,在字典树中查找,如果有遍历到单词节点,则输出对应的映射串。#include #inclu原创 2014-10-29 20:50:42 · 880 阅读 · 0 评论 -
hdu 1800 Flying to the Mars(字典树)
题目链接:hdu 1800 Flying to the Mars题目大意:N个士兵,每个士兵有一个学习的能力,学习能力强的可以教学习能力弱的,现在N个士兵需要学习使用飞行扫帚,每一个士兵在教下一个士兵的时候,会把自己练习的扫帚给他,问说N个士兵最少需要多少个扫帚。解题思路:问题转换成求众数,因为士兵的等级是一个字符串,所以用字典树来统计,需要去除前导0。#include原创 2014-10-30 18:14:39 · 973 阅读 · 0 评论 -
poj 1204 Word Puzzles(字典树)
题目链接:poj 1204 Word Puzzles题目大意:给定一个有字符组成的N行M列的矩阵,就这是Q次查询,每次查询包括一个字符串,要求在矩阵中找到起始点以及方向。解题思路:对查询建立字典树,然后暴力枚举矩阵中的起点和方向。数据有点弱,就这样给过了。#include #include #include using namespace std;const原创 2014-10-30 18:35:51 · 836 阅读 · 0 评论 -
Codeforces 282E Sausage Maximization(字典树)
题目链接:282E Sausage Maximization题目大意:给定一个序列A,要求从中选取一个前缀,一个后缀,可以为空,当时不能重叠,亦或和最大。解题思路:预处理出前缀后缀亦或和,然后在字典树中维护,每次添加并查询,过程中维护ans。#include #include #include #include using namespace std;typede原创 2014-10-30 22:45:42 · 1164 阅读 · 0 评论 -
hdu 1247 Hat’s Words(字典树)
题目链接:hdu 1247 Hat’s Words题目大意:给定若干个字符串,判断是否存在一个字符串是另外两个非空串拼接而成。按照字典序输出所有满足字符串。解题思路:对所有串建立字典树,然后判断每一个串,对于单个字符串,枚举分割点,分别在字典树中查找两个字符串是否存在。hdu 1247 Hat’s Words(字典树)#include #include原创 2014-10-29 20:54:32 · 678 阅读 · 0 评论 -
LightOJ 1269 - Consecutive Sum(字典树)
题目链接:LightOJ 1269 - Consecutive Sum题目大意:给定一个序列,选定一段区间的亦或和,输出最大和最小。解题思路:最大很简单,对所有前缀建立字典树,然后尽量往反向走;最小则需要往正向走,并且向正向走的时候要扣除自己本身。#include #include #include using namespace std;const int原创 2014-10-30 23:59:37 · 1528 阅读 · 0 评论 -
hdu 4099 Revenge of Fibonacci(字典树)
题目链接:hdu 4099 Revenge of Fibonacci题目大意:给定一个前缀,找到最小的n,保证f(n)包含前缀。f为斐波那契数列,要求n小于100000。解题思路:大数加法,对100000以内的斐波那契数预处理出前缀,这里处理的时候只需要对前50位进行加法处理即可,否则复杂度过高,因为查询的长度不会超过40。然后建立字典树,查询则在字典树上进行搜索。#i原创 2014-10-31 16:53:49 · 1468 阅读 · 0 评论 -
hdu 4760 Good Firewall(字典树)
题目链接:hdu 4760 Good Firewall题目大意:有一个防火墙,具有添加一个子网络,删除一个子网络,以及转发包的操作。添加操作包含子网络的id,以及子网络的子网掩码(计算出网络前缀,以及ip的下限),不会超过15个。删除则是给定要删除的子网络id。转发操作,给定两个ip,如果两个ip在同一个子网络中,则可以转发,否则丢弃。解题思路:对子网掩码前缀建立字典树,每原创 2014-10-31 17:00:33 · 1114 阅读 · 0 评论 -
poj 3764 The xor-longest Path(字典树)
题目链接:poj 3764 The xor-longest Path题目大意:给定一棵树,每条边上有一个权值,找出一条路径,使得路径上权值的亦或和最大。解题思路:dfs一遍,预处理出每个节点到根节点路径的亦或和rec,那么任意路径均可以表示rec[a] ^ rec[b],所以问题就转换成在一些数中选出两个数亦或和最大,那么就建立字典树查询即可。#include #in原创 2014-10-30 22:57:51 · 1031 阅读 · 0 评论 -
poj 2513 Colored Sticks(欧拉通路+并查集+字典树)
题目链接:poj 2513 Colored Sticks题目大意:有N个木棍,每根木棍两端被涂上颜色,现在给定每个木棍两端的颜色,不同木棍之间拼接需要颜色相同的端才可以,问最后能否将N个木棍拼接在一起。解题思路:欧拉通路+并查集+字典树。欧拉通路,每个节点的统计度,度为奇数的点不能超过2个。并查集,判断节点是否完全联通。字典树,映射颜色。#include原创 2014-10-29 21:31:48 · 1085 阅读 · 0 评论 -
hdu 1251 统计难题(字典树)
题目链接:hdu 1251 统计难题题目大意:略。解题思路:字典树水题,插入单个单词的时候,对路径上的节点+1,查询时返回最后落到节点的计数。#include #include #include using namespace std;const int maxn = 1000005;const int sigma_size = 26;struct Tire原创 2014-10-29 20:57:47 · 640 阅读 · 0 评论 -
uva 1462 - Fuzzy Google Suggest(字典树+dfs)
题目链接:uva 1462 - Fuzzy Google Suggest题目大意:模拟google的模糊搜索,给定给一个字符串集合,然后有n次搜索,每次有一个整数x和一个字符串,表示可以对字符串进行x次修改,包括增加、修改和删除一个字符,问修改后的字符可能是字符集中有多少个字符串的前缀。解题思路:先建立字典树,对于每次搜索,在字典树上进行dfs,根据参数x和字符串匹配的位置进行处理原创 2014-09-04 22:11:33 · 1552 阅读 · 0 评论 -
uva 1385 - Billing Tables(字典树)
题目链接:uva 1385 - Billing Tables题目大意:给定n个电话前缀,每个前缀是一个区域的前缀,现在要生成一个新的电话单,即对于每个电话号码,从旧的电话单上从前向后遍历,如果出现前缀匹配,则该电话号码对应的即为当前的区号,要求生成的新电话单尽量小。解题思路:用dfs建立字典树,在区间范围内的点对应均为对应的区号,注意如果70、71、72、...79都为SB的话,那原创 2014-09-05 22:22:40 · 1782 阅读 · 1 评论 -
Codeforces 455B A Lot of Games(字典树+博弈)
题目连接: Codeforces 455B A Lot of Games题目大意:给定n,表示字符串集合。给定k,表示进行了k次游戏,然后是n个字符串。每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为集合中某字符串的前缀,不能操作者输,新一轮由上一句输的人先手。解题思路:首先对字符集合建立字典树,然后根据博弈的必胜必败性质搜索出先手的决策状态,可决定胜败3,只能原创 2014-08-09 11:55:02 · 2103 阅读 · 6 评论 -
uva 11732 - strcmp() Anyone?(字典树)
题目链接:uva 11732 - strcmp() Anyone?题目大意:给定n个串,然后两两之间比较,问说总共要比较多少次。解题思路:字典树,建立出字典树,然后根据字典树的性质在节点记录有多少个字符串包含该节点。因为节点的个数比较多,所以用左孩子右兄弟的方法建立字典树。#include #include #include using namespace std;t原创 2014-08-28 21:14:14 · 1098 阅读 · 0 评论 -
uva 1401 - Remember the Word(字典树+dp)
题目链接:uva 1401 - Remember the Word题目大意:给出一个由S个不同单词组成的字典和一个长字符串。吧这个字符串分解成若干个单词的连接,有多少种方法。解题思路:dp(i) = sum{ dp(i+len(x))}, 单词x为S[i...L]的前缀。#include #include #include using namespace std;c原创 2014-08-28 21:07:41 · 852 阅读 · 0 评论 -
uva 11488 - Hyper Prefix Sets(字典树)
题目链接:uva 11488 - Hyper Prefix Sets题目大意:给出若干个由01组成的字符串,求一个前缀串,长度为k,出现在n个字符串中,输出最大的k*n解题思路:建立字典树,对应在节点上记录次数即可。维护最大值。#include #include #include #include using namespace std;const int maxn原创 2014-08-28 21:44:43 · 1024 阅读 · 0 评论 -
uva 1519 - Dictionary Size(字典树)
题目链接:uva 1519 - Dictionary Size题目大意:给出n个字符串组成的字典,现在要添加新的单词,从已有单词中选出非空前缀和非空后缀,组成新单词。问说能组成多少个单词。解题思路:建立一棵前缀树和一棵后缀树,有多少节点即为有多少个前缀,扣除中间的部分即可加上长度为1的字符串即可。#include #include #include using name原创 2014-09-01 22:12:24 · 1717 阅读 · 0 评论 -
uva 1556 - Disk Tree(字典树)
题目连接:uva 1556 - Disk Tree题目大意:给出N个目录关系,然后按照字典序输出整个文件目录。解题思路:以每个目录名作为字符建立一个字典树即可,每个节点的关系可以用map优化。#include #include #include #include #include #include using namespace std;const int ma原创 2014-09-02 22:36:44 · 3636 阅读 · 0 评论 -
hdu 1298 T9(字典树+DFS)
题目连接:hdu 1298 T9题目大意:模拟手机打字的猜想功能,根据概率,每按一个按键,输出可能性最高的串。先给定N个单词,以及频率,然后是Q次询问,每次询问给定一个按按键的顺序,以1为终止。解题思路:对单词表建立字典树,每个节点有一个经过的频率,这个频率是根据所有经过该节点的单词频率总和。然后DFS搜索一遍,将答案保存在ans中。#include #inc原创 2014-10-29 21:04:16 · 1421 阅读 · 0 评论 -
hdu 1671 Phone List(字典树)
题目链接:hdu 1671 Phone List题目大意:给定若干个电话,判断是否存在前缀。解题思路:hdu 1035 Immediate Decodability一样的做法。#include #include #include using namespace std;const int maxn = 100005;const int sigma_size = 1原创 2014-10-29 21:12:33 · 692 阅读 · 0 评论 -
poj 2001 Shortest Prefixes(字典树)
题目链接:poj 2001 Shortest Prefixes题目大意:给定一个字符串集合,要求使得每个字符串尽量缩短,但是仍然能区分开。解题思路:根据字符串集建立字典树,并且每插入一个字符串,所有路径上节点均加1,表示该子串是这个字符串的前缀。然后对每个字符串进行一次查找,当碰到节点的统计值为1时,表示当前子串仅为该字符串的前缀,即为要找的字符串。#inclu原创 2014-10-29 21:24:22 · 989 阅读 · 0 评论 -
poj 2503 Babelfish(字典树)
题目链接:poj 2503 Babelfish题目大意:给定若干个字符串间的映射关系,然后是若干次查询,每次查询一个字符串,判断该字符串是否有映射串,有的话输出映射串,否则输出eh。解题思路:字典树水题。#include #include #include using namespace std;const int maxn = 1e6+5;const i原创 2014-10-29 21:27:50 · 904 阅读 · 0 评论 -
hdu 1035 Immediate Decodability(字典树)
题目链接:hdu 1035 Immediate Decodability题目大意:给定若干01字符串,判断是否有某个字符串为另外一个字符串的前缀。解题思路:根据出入的字符串建立字典树,然后逐个查找,在查找的过程中如果碰到单词节点,即是存在前缀串。#include #include #include using namespace std;const int ma原创 2014-10-29 20:45:06 · 741 阅读 · 0 评论 -
Codeforces 601D Acyclic Organic Compounds(dfs+字典树合并)
题目链接:Codeforces 601D Acyclic Organic Compounds代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 300005;const int SIGMA_SIZE = 26;typed原创 2015-12-03 21:34:51 · 1147 阅读 · 0 评论