
字典树
lajiyuan_
已经退役啦,会不定期更新cf博客 or 其他计算机知识相关的博客.
展开
-
字典树(Trie树)模板以及简单的入门题总结
字典树模板const int maxn =2e6+5;//如果是64MB可以开到2e6+5,尽量开大int tree[maxn][30];//tree[i][j]表示节点i的第j个儿子的节点编号bool flagg[maxn];//表示以该节点结尾是一个单词int tot;//总节点数void insert_(char *str){ int len=strlen(str)...原创 2018-06-05 01:44:57 · 15048 阅读 · 18 评论 -
【Codeforces Round #526 (Div. 2) E. The Fair Nut and Strings】 思维题+Xor树
E. The Fair Nut and Strings题意给你两个只含ab的长度为n的字符串,让你在字典序在这两个之间的字符串中找出k个字符串,使这k个字符串有最多的不同前缀,输出不同的前缀个数。做法把ab考虑为01,而且还要考虑前缀,很显然可以想到01字典树我们把字典树画出来一看,如果我们要查011和110之间的字符串,我们发现就是这样一个区域很明显我们只要统计每个长度的前缀...原创 2018-12-12 22:25:26 · 229 阅读 · 0 评论 -
【HDU-6191-Query on A Tree】 可持久化01字典树
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6191题意给你一颗带权树,每次查询以u为根的子树上与x异或的最大值给你一颗带权树,每次查询以u为根的子树上与x异或的最大值给你一颗带权树,每次查询以u为根的子树上与x异或的最大值做法由于出现子树,我们就可以处理出dfs序由于出现子树,我们就可以处理出dfs序由于出现子树,我们就可以处理出dfs序...原创 2018-09-25 11:01:43 · 432 阅读 · 0 评论 -
【UVA 10887 Concatenation of Languages】 字典树/set
UVA-10887 本题题意就是给你AB两个字符串集,问你以A中字符串作为前缀,B中字符串作为后缀,可以得到多少个不同的字符串,就对每个拼接后的字符串放进字典树,统计单词个数就可以了#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>usin...原创 2018-06-18 12:32:00 · 245 阅读 · 0 评论 -
【Lightoj 1269 Consecutive Sum】01字典树(模板题)
Lightoj1269 本题的题意是求出一段连续的区间,使这段区间异或和最小/最大。分别输出最大异或值和最小异或值。 区间异或和的题目一般都要用到前缀异或和,我们这里可以预处理出前缀异或和,然后我们考虑,对于每个值,在字典树上查找之前出现过的最优的匹配,利用字典树的特点,将其拆为二进制,贪心的去查找,查找最大值则是0找1,1找0,查找最小值则是1找1,0找0。维护一下最大值与最小值即可。Fin...原创 2018-06-13 00:04:18 · 290 阅读 · 0 评论 -
【HDU 1075 What Are You Talking About】 字典树(Trie树)
HDU1075 本题的题意是给你火星文与地球文的映射方式,然后给你一个火星文组成的文本,若某单词在映射文本中出现过,则输出映射之后的文本。否则输出原文本。 我们可以建立trie树,插入火星文本,将返回的下标pos与地球文相对应,在翻译文本的时候,从前往后截取每一段单词,在trie树上查找该单词是否出过,要注意必须是单词,而不能是某单词的前缀。若找到则返回下标,然后输出该下标对应的地球文,否则返...原创 2018-06-13 00:02:49 · 236 阅读 · 0 评论 -
【POJ 2408 Anagram Groups】 字典树(Trie树)
POJ2408 本题题意是,把可以通过重新排列变成相同单词的单词放入一个集合,最后按找集合元素由多到少输出前五个集合,如果几何元素相同,按照字典序由小到大输出 我们考虑,如果两个单词可以通过重新排列组合变成相同单词,那么他们的字典序最小的排列方式一定是相同的,所以我们可以利用每个元素的最小排列方式判定是否在同一个集合,字典树在这里用于判定某个字符串时候出现过。最后用set来保存以便维持字典序 ...原创 2018-06-13 00:01:14 · 443 阅读 · 0 评论 -
【HDU 1247 Hat’s Words】字典树(Trie树)
HDU1247 本题题意是问你某个单词是否可以拆成单词表中的其他两个单词。 我们可以建两颗Trie树,然后分别正序倒序插入每个单词,对每个单词查询的时候,我们分别正序倒序查询,对出现过单词的前缀下表进行标记,对每个出现过单词的后缀进行标记,最后扫描标记数组,如果某个位置前缀后缀均被标记过,则表示可以拆成单词表中的两个其他单词。 HDU1247代码#include<stdio.h...原创 2018-06-12 23:55:23 · 212 阅读 · 0 评论 -
【POJ 1816 Wild Words】 字典树(Trie树)
POJ1816 本题的题意是给你n个模式串和m个匹配串,模式串中有?和∗?和∗?和*两种字符,?可以匹配任意一种字符,∗∗*可以匹配任意个字符,问每种匹配串可以和之前哪些模式串匹配。 我们先构建好字典树,对于每个匹配串实现find,find的时候用类似dfs的写法,如果当前节点的字符或者?存在,直接dfs下一个位置的字符,如果当前字符对应的位置有∗∗*存在,那么就从匹配串之后的每一个位置进行往...原创 2018-06-12 23:53:47 · 349 阅读 · 0 评论 -
【POJ 1451 T9】字典树(Trie树)
POJ1451 本题题意比较有意思,大概就是模拟手机输入法,先给你一个用户的词库,即每个单词出现的次数,这个时候再按照九键输入法给你一个数字序列,问你在输入这个序列的过程中,出现的字符串顺序,也就是对于每个数字序列,给出一个最有可能出现的字符串。 这道题我的做法比较巧妙,但是不怎么会算复杂度,还是很快的过去了。首先我们考虑,对于每个数字序列,我们都可以用一个string去映射,这样我们可以用一...原创 2018-06-12 23:51:08 · 567 阅读 · 0 评论 -
【POJ 2513 Colored Sticks】 字典树(Trie树)
POJ2513 本题题意是给一堆木棒,每种木棒左右两端有两种颜色,木棒进行拼接的时候,只有相同颜色之间才可以拼接,问最后是否可以将所有木棒拼为一根木棒。 我们考虑把同一种颜色的点聚在一起,我们就可以得到一个无向图,如果这个无向图是欧拉图,代表展开之后可以一笔走完,也就是可以连接成一条木棒。所以我们用trie树判断每种颜色出现的次数,再用并查集判一下图是否连通,最后用欧拉图的性质判断一下是否为欧...原创 2018-06-12 23:47:53 · 268 阅读 · 0 评论 -
【Lightoj 1224 DNA Prefix 】字典树(Trie树)
LightOJ1224 本题题意是让你找出一个字符串,使该字符串作为前缀的次数∗∗*该字符串的长度结果最大 我们首先构建好trie树,我们利用记录节点出现次数的方式存储,这时候结果就是sum[root]∗当前的lensum[root]∗当前的lensum[root]*当前的len,对于当前的len也就是递归深度,如果我们要存入所有节点之后再重新扫一遍Trie树复杂度会高很多,所以我们可以在插入...原创 2018-06-12 23:45:11 · 317 阅读 · 0 评论 -
【POJ 3630 Phone List】字典树(Trie树)
POJ3630 本题题意就是给你一个字符串集合,问你否所有的字符串都不是其他人的前缀。 首先我们构造出Trie树,然后对每个字符串find,当find的路径上如果出现其他字符串结尾标记,就说明其他字符串是当前字符串的前缀。注意这里对每个字符串find的时候只要搜索到len−1len−1len-1即可,如果搜索到lenlenlen,那么将会将本身的字符串统计进去。 POJ3630代码#...原创 2018-06-12 23:42:14 · 272 阅读 · 0 评论 -
【POJ 2001 Shortest Prefixes】 字典树(Trie树)
POJ2001 题意就是求一个能代表这个字符串的最短前缀,也就是只有这个字符串具有的前缀。 做法很显然,我们先构建好Trie树,然后对每个单词进行find,递归到直到节点出现次数为1,表示这个节点只有这一个单词走过,返回就ok。这里我用了string不断拼接字符,然后直接返回,减少了一些代码量。 POJ2001代码#include<stdio.h>#include<...原创 2018-06-12 23:40:37 · 170 阅读 · 0 评论 -
【HDU 2072 单词数】 字典树/SET
HDU2072 题意就是出现的不同单词个数 直接把字符全部插入Trie树中,然后统计所有具有flagg标记的节点个数就好了。 也可以边插入边统计,如果当前字符串结尾下标已经被标记,就不对答案做贡献,否则ans++. HDU 2072 代码#include<stdio.h>#include<iostream>#include<string.h>#...原创 2018-06-12 23:37:53 · 233 阅读 · 0 评论 -
【HDU 1251 统计难题】 字典树(Trie树) 模板题
HDU1251 题意就是统计出以某个字符串为前缀的单词数量,首先构建出trie树并记录每个节点的访问次数,然后在上面查询就好了,模板题。 HDU1251代码#include&lt;stdio.h&gt;#include&lt;iostream&gt;#include&lt;string.h&gt;using namespace std;const int maxn =2e6+5...原创 2018-06-12 23:35:35 · 285 阅读 · 0 评论 -
【Codeforces 665E-Beautiful Subarrays】01字典树
Beautiful Subarrays题目链接:https://codeforces.com/contest/665/problem/EDescriptionInputOutput##Sample Input3 11 2 3##Sample Output5题意给出一个数组,找出有多少个连续子序列满足子序列中所有元素的异或和大于等于k。题解:首先把连续子序列的异或和...原创 2019-09-26 00:54:03 · 310 阅读 · 0 评论