
ACM-字典树
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
lightoj 1114(trie)
题意:给出n个单词,其中首尾字母相同,中间字母任意排列的单词是同一个码,然后给出m个句子,每个句子含有若干个单词,问多少个不同的句子和这个句子有相同的编码。 题解:把每个单词除去首尾的部分按字典序排序,然后插入字典树,val[u]存节点出现次数,在每个单词的最后一个节点数量累加,然后把输入的句子中每个统计到的单词数量乘起来。#include <cstdio> #include <cstring>原创 2015-11-03 17:08:15 · 721 阅读 · 0 评论 -
poj 2001(trie)
题意:给一些单词,输出每个单词的一个前缀使这个前缀能唯一标识这个单词。 题解:先建字典树,用val[i]保存当前节点是多少个单词的前缀,然后再从头把每个单词放到字典树里查询,直到val[i]==1结束,表示到这里只能标识唯一单词,当前位置就是要输出的前缀的结尾位置。#include <cstdio> #include <cstring> #include <algorithm> using nam原创 2015-09-18 23:13:03 · 422 阅读 · 0 评论 -
poj 3630(trie)
题意:给出n个串,如果存在某个串是另一个串的前缀,就输出NO,否则输出YES。 题解:把所有串按字典序排序,然后建树,val[i]保存当前节点是否是某个单词的结尾,如果建树中到当前节点发现已经有值也就是val[i]!=0,就是有前缀。#include <cstdio> #include <cstring> #include <algorithm> using namespace std; cons原创 2015-09-18 23:21:36 · 439 阅读 · 0 评论 -
poj 2503(trie)
题意:给出每个单词的第一种写法和第二种写法,然后询问给出第二种写法的一个单词,要求输出它的第一种写法,没有就输出eh。 题解:字典序建树,val[i]就存到节点i为止的对应第一种字符串,然后扫描每个询问单词看是否有解。#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N原创 2015-09-18 23:18:28 · 416 阅读 · 0 评论 -
uvalive 7043(trie)
题意:给出n个IPv4的子网地址,格式是a-b-c-d/l,a b c d l都是十进制数,然后l是网络地址的长度,最长到32,要求输出最低限度的所有的未能划分出的子网地址,这些子网和给出的n个子网没有交集,这些地址和给出的n个地址能组成完整的网络地址。 题解:把给出的所有子网地址建字典树,然后暴力递归找所有未被包含在已有子网里的子网地址。#include <cstdio> #include <c原创 2015-09-19 00:47:25 · 753 阅读 · 0 评论 -
hdu 1251(trie)
题解:字典树模板题,val[i]保存当前节点i是多少个单词的前缀。#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1000005; int ch[N][30], val[N], sz;void insert(char *s) { int u = 0, le原创 2015-09-18 23:07:42 · 344 阅读 · 0 评论 -
hdu 5536(trie + 贪心)
题意:有n个数字,选择三个下标不同的数字,其中两个求和,然后和第三个数字异或得到的最后结果是A,问A最大是多少。 题解:长春赛区的一题,据说可以三层for过掉,还是用字典树好好写一遍,首先枚举把n个数字按二进制码插入字典树,维护val[u]节点u是多少个数字的前缀,id[u]是节点u是数字id[u]的最后一个节点,然后枚举两个求和的点,把这两个点在字典树上用flag[u]标记起来,然后把sum =原创 2015-11-04 18:56:23 · 539 阅读 · 0 评论 -
uvalive 3942(dp + trie)
题意:有一个长字符串,然后给出了n个不同的单词,问长字符串是由这些单词构成的不同方案有几种。 题解:明显是dp,f[i]表示从字符i开始有多少种方案,f[i] = sum{f[i + len(x)},x是后半段字符串的前缀,如果枚举前缀肯定会超时,那么用前缀树trie可以直接找到所有的前缀x,用在状态转移方程中。 #include #include const int MOD = 2007原创 2015-04-09 00:07:45 · 651 阅读 · 0 评论 -
hdu 4825(trie)
题意:给出n个数字,然后m次询问,每次询问给出一个数字k,问n个数字中哪个数字s和k异或得到的数字最大,输出数字s。 题解:n个数字建立字典树,从最高位开始贪心,如果s当前位是0,就往1走,反之亦然,走到最后输出对应值。#include <cstdio> #include <cstring> #include <algorithm> #define ll long long using names原创 2015-11-04 14:14:51 · 493 阅读 · 0 评论 -
lightoj 1269(trie)
题意:给出长度为n的序列,问选出任意区间的所有数字的异或值,最大最小各是多少。 题解:字典树经典问题,把前i个串的异或值都插入到字典树里,然后如果要找最大值,就把所有前缀去贪心出最大值,每次找和自己不一样的节点走,如果要找最小值,也是把所有前缀拿去贪心出最小值,每次找和自己当前位一样的节点,找最后一个分叉点,但要刨除自己。#include <cstdio> #include <cstring> #原创 2015-11-04 11:40:16 · 661 阅读 · 0 评论 -
lightoj 1224(trie)
题意:有n个字符串,要求输出一个最大的值是公共前缀×其长度。 题解:把字符串都拿去建字典树,val[i]存节点i是多少个串的前缀,这个最大的值就是节点深度depth[u]×val[u]的最大值。这题好坑,数组开小了给的是wa。。。#include <cstdio> #include <cstring> #include <algorithm> #include <map> using namesp原创 2015-11-03 19:47:59 · 849 阅读 · 0 评论