
字典树
文章平均质量分 79
cillyb
这个作者很懒,什么都没留下…
展开
-
CodeForces 566 A Matching Names(Trie 匹配LCP和最大)
题意:有n个A字符串和n个B字符串,问如何匹配能使LCP(最长公共前缀)和最大。 思路:将A和B分别插入Trie,节点保存的是具有该前缀的字符串id,然后对Trie进行dfs,优先选择深的匹配,并标记。 然后回溯去 匹配,被标记过的不再进行匹配。 代码: #include using namespace std; const int maxnode = 8e5+5; int原创 2017-07-12 01:34:54 · 595 阅读 · 0 评论 -
HDU 6191 Query on A Tree (dfs序+可持久化01Trie)
题意:给你一棵树,每个节点有一个权值,q次询问,每次询问求以u为根节点的子树异或上x的最大值。n,q 思路:要解决子树的问题,那么就是dfs序,解决异或最大值,那么就是01Trie,然后这题需就是根据dfs序建立可持 久化01Trie就好了。 代码: #include using namespace std; const int maxn = 1e5+5; const i原创 2017-09-03 18:05:34 · 558 阅读 · 0 评论 -
Codeforces Round #430 (Div. 2) D. Vitya and Strange Lesson(01Trie)
题意:给你一个数组,m次操作,每次操作给你个x,把所有数亦或x,每次操作后输出数组的mex值,mex值表示第一个未出现的自然数。 思路: 1. 异或的效果是可以累加的,所以每次操作的x亦或可以叠加起来成X,这样每次操作就是对原数组亦或X。 我们一开始把原数组不存在的数插入到01Trie,现在对原数组进行一次异或操作,则异或之后的a数组的mex值就是 插入 的数组(未出现的值)xo原创 2017-08-31 15:29:07 · 414 阅读 · 0 评论 -
BZOJ 3261 最大异或和 && qwb VS 去污棒(可持久化01Trie)
Problem I: qwb VS 去污棒 Time Limit: 2 Sec Memory Limit: 256 MB Submit: 95 Solved: 36 [Submit][Status][Web Board] Description qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底下赏月。在外人看来,他每天自言自语,其实他在和自己的影子“去污棒”聊天。 去污棒和原创 2017-08-29 22:42:28 · 565 阅读 · 0 评论 -
HDU 5536 Chip Factory (01Trie)
题意:给你n个数(n 思路:先将n个数建立01Trie,然后枚举i,j,从01Trie中删除a[i]和a[j],然后去查询与(a[i]+a[j])异或的最大值,查询完后再插回去。 另外,删除操作是这样实现的,我们每个节点记录一个val值。 val 插入时对所有经过节点的val值加1,删除就将对应节点的val值减1。 在树上匹配的时候就只走那些val值为正的原创 2017-07-06 17:25:59 · 369 阅读 · 0 评论 -
QDUOJ 65 again and again(Trie)
题意:先给你n个字符串,然后q次询问,每次询问以给定字符串为前缀的存在与n个字符串中的最短的单词。若有多个输出字典序最小的那个。 思路:字典树中存两个变量,一个记录该前缀的最短字符串长度,一个记录该节点是否是某个字符串的结尾。 代码: #include #include #include #include using namespace std; const int maxn原创 2017-07-06 21:51:50 · 293 阅读 · 0 评论 -
POJ 2001 Shortest Prefixes (Trie)
题意:给你n个字符串(n 思路:字典树中的val记录前缀数量,如果val==1就说明只有这个字符串本身有这前缀,也就是答案。 代码: #include #include #include #include using namespace std; const int maxn = 27; const int maxnode = 20*1000+5; int ch[maxnod原创 2017-07-06 22:42:05 · 334 阅读 · 0 评论 -
HDU 1247 Hat’s Words (Trie)
题意:给你n个单词(n 思路:对于每个单词去枚举分割点,找一下拆成的两个单词是否都存在即可。 这题坑点比较多: 1.读入时不能用gets()!=NULL, 要用scanf()!=EOF 2.找到正确的分割点输出单词后记得要break,否则可能多次输出。 3.自己想简单了,Match时不是光val==1就行了,忘记考虑ch[][]不存在时也要返回false。 代码原创 2017-07-07 00:23:03 · 399 阅读 · 0 评论 -
Educational Codeforces Round 23 E. Choosing The Commander(01Trie)
题意:三个操作:1增加一个数,2删除一个数,3求所有数^k 思路:01Trie,求^k 代码: #include using namespace std; const int maxnode = 1e5*32+5; int ch[maxnode][2], val[maxnode], sz; void init() { sz = 1; memset(ch[0]原创 2017-07-10 12:03:46 · 330 阅读 · 0 评论 -
HDU 1251 统计难题 (字典树模板题)
题意:给你一堆单词,现在有多次询问,每次询问求以给定字符串作为前缀的单词有多少个。 Sample Input banana band bee absolute acm ba b band abc Sample Output 2 3 1 0 代码: #include #include #include #include using namespace原创 2017-07-05 23:24:32 · 385 阅读 · 0 评论 -
HDU 4825 Xor Sum (01字典树模板题)
题意:给你n个数,然后q次询问,每次询问让你找指定值x与n个数中的哪个数异或后最大。 01字典树的实现可以看成是把一个数的二进制字符化后插入到一颗一般的字典树中 比如在01字典树种插入3时 相当于在字典树中插入00 …..00011(一共32位,这个根据具体问题) 查找最大异或值的时候我们是从最高位 向下贪心查找 贪心策略为:当前查找第k位 二进制数位ID原创 2017-07-05 23:32:05 · 375 阅读 · 0 评论 -
2017 ACM-ICPC 亚洲区(西安赛区)网络赛 I. Barty's Computer(哈希||字典树)
题意:一共Q次操作,操作有两种: 1 str : 表示增加一个字符串str(长度一定是偶数) 2 a b c d : 询问有多少个字符串满足str = a + s1 + b + c + s2 + d, 且|a|+|s1|+|b| = |c|+|s2|+|d|, s1, s2可以是任意字符串,空的也可以。 Q 思路:因为要求|a|+|s1|+|b| = |c|+|s2|+|d|,原创 2017-10-03 21:21:12 · 672 阅读 · 0 评论