Tire树&AC自动机
文章平均质量分 77
AC_Gibson
这个作者很懒,什么都没留下…
展开
-
HDU1251 统计难题 tire树
题目大意:给你一系列字符串作为母串,对于若干次询问,每次询问包含一个字符串,输出该以字符串为前缀的母串的数目。分析:典型的tire树,在每次插入数据的时候纪录前缀数。实现代码如下:#include #include #include #include using namespace std;#define son_num 30 //字符串中包含的字符个数#d原创 2015-04-29 14:39:47 · 504 阅读 · 0 评论 -
POJ2418 Hardwood Species Tire树
题目大意:若干棵树构成一片树林,我们知道每一棵树的名字,按树名字典序输出每种一树所占的比率。分析:由于树名不止是一个单词,可以用gets输入,输入的同时记录树的数量,字符串排序后遍历一遍即可。为了保证重复树名只输出一次,我们可以在每种树输出一次后标记它的状态,下次不再重复输出。实现代码如下:#include #include #include #inclu原创 2015-05-03 17:57:42 · 367 阅读 · 0 评论 -
HDU2296 Ring AC自动机+DP
题目链接:点击打开链接题目大意:有m个关键字,每个关键字有一个权值,让构造出一个长度不大于n的目标串,使得该目标串的权值尽可能大。对于相同的权值的多个目标串,我们需要输出长度最小的一组,存在多个长度相同的目标串时输出字典序最小的一组。分析:构造出tire树,对于树中的每一个节点我们看做为一个状态,定义dp(i,j)为前i个字符在状态j时的最大权值,string s(原创 2015-05-11 18:36:19 · 456 阅读 · 0 评论 -
HDU2825 Wireless Password AC自动机+状态压缩DP
题目链接:点击打开链接题目大意:有m个关键字(只含有小写字母),让找出最少含有k个关键字的长度为n的字符串(也只含有小写字母)的个数。分析:做了这几道AC自动机——DP的题,也发现了这类题的一些规律:都是先按关键字建立一颗tire树,然后把树中的每一个节点看做是一种状态。本题定义dp(i,j,k)为长度为i的以j状态结尾,并且含有关键字个数为状态k时的字符串原创 2015-05-11 20:55:45 · 571 阅读 · 0 评论 -
HDU1800 Flying to the Mars Tire树
题目大意: 8888年,地球被PPF帝国统治着。由于人口的增长,PPF需要寻找更多土地让新出生的人生存。最终,PPF决定去攻打统治火星的Kscinow帝国。现在问题出现了。士兵怎么能到达火星呢?PPF召集他的将士们来征求他们的建议。由于火星上没有路,他们决定飞过去。 现在他们开始学习骑扫帚飞行的技术。我们假设每个士兵有一个数字代表他的级别,级别高的士兵可以教级别低的士兵,但是级别低的士兵原创 2015-05-04 09:34:56 · 453 阅读 · 0 评论 -
hihoCoder1014 Tire树
题目连接:hihoCoder1014分析:建立一颗词典树,对于每一次询问,输出以该询问对应字符串的num值即可。实现代码如下:#include #include #include using namespace std;#define son_num 30 //字符串中包含的字符个数#define maxn 10 //单词的最大长度struc原创 2015-05-04 21:32:23 · 613 阅读 · 0 评论 -
hihoCoder1107 Shortest Proper Prefix Tire树
题目链接:hihoCoder1107题目大意:给你n个字符串,定义proper prefix为其中某个字符串s的前缀满足:在这n个字符串中出现的次数不超过5次;定义shortest proper prefix为其中某个字符串s满足:s是proper prefix且s的所有前缀(不包括s本身)都不是proper prefix.现在让找出这n个字符串中shortest proper pre原创 2015-05-05 11:02:39 · 516 阅读 · 0 评论 -
HDU2222 Keywords Search AC自动机
/*题目大意:给你n个关键字和一个模式串,让你找出模式串中有多少个关键字分析:AC自动机入门题。可以作为AC自动机的模板*/#include #include #include #include using namespace std;#define son_num 26#define maxn 1000005char str0[maxn];struct node{原创 2015-05-06 17:42:21 · 494 阅读 · 0 评论 -
HDU3695 Computer Virus on Planet Pandora AC自动机
题目大意:给出n个关键字和一个模式串,找出模式串和他的反串中一共有多少个关键字。另外模式串是可以压缩输入的:AB[3X]即为ABXXX。分析:以n个关键字建一颗Tire树,然后正序反序遍历一遍模式串即可。实现代码如下:#include #include #include #include using namespace std;#define son_原创 2015-05-06 21:46:35 · 581 阅读 · 0 评论 -
HDU2896 病毒侵袭 AC自动机
题目大意:给出n个病毒和n个网站,找出每一个网站中含有的病毒种类,并按病毒编号升序输出,最后统计含有病毒的网站个数。分析:比较裸的AC自动机的题,我们可以在构造tire树的过程中顺便把编号插入,然后询问时纪录病毒个数的同时用一个数组纪录病毒的编号,然后排序输出即可(WA若干次才发现忘把病毒按编号排序后再输出了)。还有就是本题空间卡的很死,你要是按题意(每一个字符都是课件的ASC2可见代原创 2015-05-08 10:30:40 · 1865 阅读 · 1 评论 -
HDU2457 DNA repair AC自动机+DP
题目链接:点击打开链接题目大意:给出n个带有遗传病的DNA序列和目标DNA序列,可以修改目标序列上若干字符使得目标串上不含有带有遗传病的DNA序列,修改尽可能少的字符串。分析:我们以这n个遗传病序列建一颗tire树,把树上的每个节点看做是一种状态,定义dp(i,j)为前i个字符串在j状态下为目标串(不含遗传病序列)时需修改的最少次数,这样在建完树后遍历一遍树上的节点,维护一原创 2015-05-11 15:15:17 · 535 阅读 · 0 评论 -
HDU2243 考研路茫茫——单词情结 AC自动机+矩阵连乘
Problem Description背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根的单原创 2015-05-11 14:21:56 · 784 阅读 · 0 评论 -
HDU1004 Let the Balloon Rise tire树
题目大意:找出若干字符串中出现频率最高的字符串并输出。分析:Tire树的应用,不过本题数据量比较小,纯暴力也能A。Tire树实现代码如下:#include #include #include using namespace std;#define son_num 30 //字符串中包含的字符个数#define maxn 15 //单词的最大长度struct tire原创 2014-08-07 10:14:27 · 480 阅读 · 0 评论 -
HDU3065 病毒侵袭持续中 AC自动机
题目大意:给出n个病毒特征和目标网站源码,让找出有多少种病毒出现过,对于出现过的病毒,纪录出现了多少次。分析:和 HDU2896 差不多,在构造tire树的过程中纪录每个病毒的编码,我们可以创建一个病毒结构体来纪录病毒的输入次序,以及病毒特征码和出现次数,然后在询问过程中可以直接按编号来纪录每一种特征码的病毒出现的次数,最后把出现次数不为0的特征码输出即可。需要注意的是,本题病原创 2015-05-08 11:54:31 · 606 阅读 · 0 评论 -
POJ2778 DNA Sequence AC自动机+矩阵连乘
题目大意:某些特定的DNA片段被认为是携带遗传病的序列,现在给出m个带有遗传病的DNA序列,让找出有多少种长度为n的DNA序列不包含任何的遗传病。分析:首先,我们知道,对于一个图G的邻接矩阵matrix[ i ][ j ]来说,其值表示的是从节点i走到节点j走一步有多少种不同的走法;对于matrix^2 [ i ][ j ]来说,表示是从节点i到节点j走两步一共有多少种不同的走原创 2015-05-09 12:20:37 · 399 阅读 · 0 评论 -
Tire树(字典树)的基本操作
Tire树的基本原理: Tire树是一种树形结构,因其是词典的一种存储方式,故又叫字典树。词典中的每一个单词在tire树中表现为一条从根结点出发的路径,路径边上的点连起来就是一颗tire树,如右图:其中含有ab,abc,bac,bbc,ca五个单词。 Tire树的基本性质可以归纳为:(1)根结点不包含字符,其他的每一个节点只包含一个字符;(2)从根结点到原创 2015-04-29 13:20:21 · 5390 阅读 · 2 评论 -
HDU1075 What Are You Talking About Tire树
题目大意:给你一篇火星文,让你按给定的词典翻译成英文并输出翻译后的文章,对于词典中没有的火星文,直接原样输出即可。分析:Tire树的应用,在插入数据的时候顺便把火星文对应的英文单词记录即可,这样在查询的时候,如果查询成功,那么就输出其对应的英文,否则原样输出。实现代码如下:#include #include #include #include using nam原创 2015-04-30 13:30:01 · 652 阅读 · 0 评论 -
HDU1247 Hat’s Words Tire树
题目大意:给你若干字符串,让你找出这些字符串中由其他两个字符串连接成的字符串。分析:我们很容易想到的是先把这些字符串存放到tire树中,然后分别查询每两个字符串连接构成的新字符串是否在树中,想法很美好,但这样的时间复杂度是0(n^2)的,而n是50000的,果断TLE了。后来我换了一种思路,和合并操作等价的操作就是拆分:我们遍历这n个字符串,把每个字符串可拆分的字符串找出来,分别判断他原创 2015-04-30 17:49:51 · 468 阅读 · 0 评论 -
POJ2503 Babelfish Tire树
题目大意:给出一个单词之间的意义对应关系,然后有若干次询问,每次询问给出一个单词,让你输出与该单词对应的单词。分析:map可以做,tire树也行。可以说是 HDU1075 的简易版。不过这题真正纠结人的是输入部分====卡了我n久啊。实现代码如下:#include #include #include #include #include using namesp原创 2015-04-30 19:06:32 · 471 阅读 · 0 评论 -
HDU1671 POJ3630 Phone List Tire树
题目大意:给你n个长度小于10的电话号码,让你判断是否存在一个号码是其他号码的前缀,若存在,输出NO,否则输出YES。分析:大量数据查询短字符串,一看就是Tire树的题。把n个号码存入之后,遍历查询这n个号码,如果存在某一个号码所对应的节点的num值大于1,那么就说明该组号码有不止一个这样的前缀,即:存在一个号码是其他号码的前缀,跳出循环输出结果即可;如果所有节点的num值都不大于1,原创 2015-04-30 16:30:51 · 487 阅读 · 0 评论 -
POJ2945 Find the Clones Tire树
题目大意:给出n个人的DNA序列,这些序列长度相同且不大于20,让找出重复k次的DNA的个数,其中,k=1,2,...n。分析:这道题的处理方法很多,比较普遍的有用STL中的map的,有快排的,也有Tire树的。我试了下map的,怎么优化都是TLE,在网上找了“别人AC的代码”交也是TLE,严重怀疑这种方法的可行性啊。不过还是把代码贴出来了,可以参考一下:map代码如下(TLE版)原创 2015-05-03 16:43:13 · 389 阅读 · 0 评论 -
POJ2513 Colored Sticks 欧拉路径+Tire树
题目链接:http://poj.org/problem?id=2513题目大意:有n条木棒,没条木棒两端各有一种颜色,木棒之间可以连接当且仅当连接端的颜色相同,让判断对于给出的若干木棒,能否全部连接起来。分析:以每种颜色为顶点建图,要想所有木棒都连接起来,即找出该图的一条欧拉路径。对于每种颜色,我们需要一一对应一个数字,我用map写了一个,果然TLE了,毕竟数据量还是不小的原创 2015-08-19 14:25:19 · 387 阅读 · 0 评论