
字符串
文章平均质量分 74
AC_Gibson
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ZOJ3432 Find the Lost Sock 字符串异或
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4116题目大意:有n双袜子中的2n-1只,每只袜子都有一个长度为7个字符的名字,现在让你找出缺少的那只袜子的名字。分析:将所有的袜子名字异或起来,那么最后得到的答案就是只有一只的袜子的名字,直接输出即可。实现代码如下:#inclu原创 2015-10-09 10:06:21 · 605 阅读 · 0 评论 -
HDU2296 Ring AC自动机+DP
题目链接:点击打开链接题目大意:有m个关键字,每个关键字有一个权值,让构造出一个长度不大于n的目标串,使得该目标串的权值尽可能大。对于相同的权值的多个目标串,我们需要输出长度最小的一组,存在多个长度相同的目标串时输出字典序最小的一组。分析:构造出tire树,对于树中的每一个节点我们看做为一个状态,定义dp(i,j)为前i个字符在状态j时的最大权值,string s(原创 2015-05-11 18:36:19 · 505 阅读 · 0 评论 -
POJ2418 Hardwood Species Tire树
题目大意:若干棵树构成一片树林,我们知道每一棵树的名字,按树名字典序输出每种一树所占的比率。分析:由于树名不止是一个单词,可以用gets输入,输入的同时记录树的数量,字符串排序后遍历一遍即可。为了保证重复树名只输出一次,我们可以在每种树输出一次后标记它的状态,下次不再重复输出。实现代码如下:#include #include #include #inclu原创 2015-05-03 17:57:42 · 411 阅读 · 0 评论 -
HDU2243 考研路茫茫——单词情结 AC自动机+矩阵连乘
Problem Description背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根的单原创 2015-05-11 14:21:56 · 855 阅读 · 0 评论 -
HDU2457 DNA repair AC自动机+DP
题目链接:点击打开链接题目大意:给出n个带有遗传病的DNA序列和目标DNA序列,可以修改目标序列上若干字符使得目标串上不含有带有遗传病的DNA序列,修改尽可能少的字符串。分析:我们以这n个遗传病序列建一颗tire树,把树上的每个节点看做是一种状态,定义dp(i,j)为前i个字符串在j状态下为目标串(不含遗传病序列)时需修改的最少次数,这样在建完树后遍历一遍树上的节点,维护一原创 2015-05-11 15:15:17 · 580 阅读 · 0 评论 -
HDU1671 POJ3630 Phone List Tire树
题目大意:给你n个长度小于10的电话号码,让你判断是否存在一个号码是其他号码的前缀,若存在,输出NO,否则输出YES。分析:大量数据查询短字符串,一看就是Tire树的题。把n个号码存入之后,遍历查询这n个号码,如果存在某一个号码所对应的节点的num值大于1,那么就说明该组号码有不止一个这样的前缀,即:存在一个号码是其他号码的前缀,跳出循环输出结果即可;如果所有节点的num值都不大于1,原创 2015-04-30 16:30:51 · 543 阅读 · 0 评论 -
POJ2503 Babelfish Tire树
题目大意:给出一个单词之间的意义对应关系,然后有若干次询问,每次询问给出一个单词,让你输出与该单词对应的单词。分析:map可以做,tire树也行。可以说是 HDU1075 的简易版。不过这题真正纠结人的是输入部分====卡了我n久啊。实现代码如下:#include #include #include #include #include using namesp原创 2015-04-30 19:06:32 · 507 阅读 · 0 评论 -
Tire树(字典树)的基本操作
Tire树的基本原理: Tire树是一种树形结构,因其是词典的一种存储方式,故又叫字典树。词典中的每一个单词在tire树中表现为一条从根结点出发的路径,路径边上的点连起来就是一颗tire树,如右图:其中含有ab,abc,bac,bbc,ca五个单词。 Tire树的基本性质可以归纳为:(1)根结点不包含字符,其他的每一个节点只包含一个字符;(2)从根结点到原创 2015-04-29 13:20:21 · 5616 阅读 · 2 评论 -
HDU1247 Hat’s Words Tire树
题目大意:给你若干字符串,让你找出这些字符串中由其他两个字符串连接成的字符串。分析:我们很容易想到的是先把这些字符串存放到tire树中,然后分别查询每两个字符串连接构成的新字符串是否在树中,想法很美好,但这样的时间复杂度是0(n^2)的,而n是50000的,果断TLE了。后来我换了一种思路,和合并操作等价的操作就是拆分:我们遍历这n个字符串,把每个字符串可拆分的字符串找出来,分别判断他原创 2015-04-30 17:49:51 · 521 阅读 · 0 评论 -
HDU1075 What Are You Talking About Tire树
题目大意:给你一篇火星文,让你按给定的词典翻译成英文并输出翻译后的文章,对于词典中没有的火星文,直接原样输出即可。分析:Tire树的应用,在插入数据的时候顺便把火星文对应的英文单词记录即可,这样在查询的时候,如果查询成功,那么就输出其对应的英文,否则原样输出。实现代码如下:#include #include #include #include using nam原创 2015-04-30 13:30:01 · 760 阅读 · 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 · 501 阅读 · 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 · 611 阅读 · 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 · 443 阅读 · 0 评论 -
FZU2129 子序列个数 DP
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2129题目大意:求一序列的不相同的子序列的个数。分析:注意区分子序列和子串的区别:子序列可以不连续,子串必须连续。先说说本题吧。我们用dp[ i ]来纪录以 前i个字符组成的序列 的不同子序列的个数,很显然,对于dp[ i+1 ],我们把dp[ i+1 ]=dp[ i ]×2+1,原创 2015-08-18 15:31:42 · 620 阅读 · 0 评论 -
HDU1228 A+B 字符串模拟题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1228实现代码如下:#include #include #include using namespace std;char num[10][10]={"zero","one","two","three","four","five","six","seven","eight","n原创 2015-05-22 10:08:51 · 524 阅读 · 0 评论 -
HDU3065 病毒侵袭持续中 AC自动机
题目大意:给出n个病毒特征和目标网站源码,让找出有多少种病毒出现过,对于出现过的病毒,纪录出现了多少次。分析:和 HDU2896 差不多,在构造tire树的过程中纪录每个病毒的编码,我们可以创建一个病毒结构体来纪录病毒的输入次序,以及病毒特征码和出现次数,然后在询问过程中可以直接按编号来纪录每一种特征码的病毒出现的次数,最后把出现次数不为0的特征码输出即可。需要注意的是,本题病原创 2015-05-08 11:54:31 · 657 阅读 · 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 · 662 阅读 · 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 · 542 阅读 · 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 · 584 阅读 · 0 评论 -
HDU2203 亲和串 KMP
分析:第一想法就是把字符串s1循环移位一次,然后判断s2是否为移位后的s1的子串,KMP实现的,但是仔细一想这样存在在严重的缺陷,比如字符串s1=“abc”,s2=“abcabcabcabcabc”,理论上,这是符合亲和串的定义的,但我在完全没考虑这种可能的情况下也AC了,这能说明这题的数据量小。KMP实现代码如下:#include #include #include usi原创 2015-05-04 14:36:49 · 463 阅读 · 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 · 661 阅读 · 0 评论 -
HDU2594 Simpsons’ Hidden Talents KMP
题目大意:给出两个字符串s1,s2,长度小于50000,让找出s1最长的前缀,同时该前缀又是s2的后缀,如果存在,输出该前缀和前缀的长度。分析:我们把s1和s2合成一个字符串,求出该模式串的next数组,如果next[ len ]不为0(len为合成的字符串的长度),则即为所求。实现代码如下:#include #include #include #include原创 2015-05-04 21:17:56 · 420 阅读 · 0 评论 -
HDU1800 Flying to the Mars Tire树
题目大意: 8888年,地球被PPF帝国统治着。由于人口的增长,PPF需要寻找更多土地让新出生的人生存。最终,PPF决定去攻打统治火星的Kscinow帝国。现在问题出现了。士兵怎么能到达火星呢?PPF召集他的将士们来征求他们的建议。由于火星上没有路,他们决定飞过去。 现在他们开始学习骑扫帚飞行的技术。我们假设每个士兵有一个数字代表他的级别,级别高的士兵可以教级别低的士兵,但是级别低的士兵原创 2015-05-04 09:34:56 · 526 阅读 · 0 评论 -
2015编程之美资格赛:回文子序列数 DP
2015编程之美资格赛第二题:回文子序列数题目链接:http://hihocoder.com/contest/msbop2015qual/problem/2分析:动态规划。用一个数组dp(i,j)表示在给定字符串str中第i个元素到第j个元素之间回文子序列的个数,在j==i时dp(i,j)=1;j和i相邻时判断str[ i ]和str[ j ]是否相等,分别赋值给dp(i,j)3和原创 2015-04-18 14:53:58 · 834 阅读 · 0 评论 -
HDU2896 病毒侵袭 AC自动机
题目大意:给出n个病毒和n个网站,找出每一个网站中含有的病毒种类,并按病毒编号升序输出,最后统计含有病毒的网站个数。分析:比较裸的AC自动机的题,我们可以在构造tire树的过程中顺便把编号插入,然后询问时纪录病毒个数的同时用一个数组纪录病毒的编号,然后排序输出即可(WA若干次才发现忘把病毒按编号排序后再输出了)。还有就是本题空间卡的很死,你要是按题意(每一个字符都是课件的ASC2可见代原创 2015-05-08 10:30:40 · 1945 阅读 · 1 评论 -
hihoCoder1015 KMP算法
题目连接:http://hihocoder.com/problemset/problem/1015分析:找出子串在主串中出现的次数。实现代码如下:#include #include #include using namespace std;int nex[10100];char a[1000010],b[10100];void init_next(){原创 2015-04-27 14:24:13 · 894 阅读 · 0 评论 -
POJ2406 Power Strings KMP-next数组的循环节
题目大意:给定一个字符串,让你找出该字符串的最大循环节。分析:next数组的循环节问题。一开始我是暴力next数组的每一个值,找出其中满足循环的最大值,后来发现这样做不可行,因为对于aaaaaab这个字符串来说,他的循环节很明显为1,但aaaaaa这个子串的循环节是6,所以找出整个next数组的最大循环节就出错了。其实我们只需找出next[ len ]这一个值的循环节即可,因为这是个后原创 2015-04-23 20:52:31 · 605 阅读 · 0 评论 -
HDU1711 Number Sequence
题目大意:给你两个序列a和b,让判断b是否是a的子串,如果是,找出在a中的位置,否则输出-1.分析:裸KMP。实现代码如下:#include #include #include using namespace std;const int MAX=1000010;int next[10010],n,m;int a[MAX],b[10010];void ini原创 2014-09-18 10:00:06 · 496 阅读 · 0 评论 -
HDU2087 剪花布条
分析:典型的KMP问题。找出模式串的next数组值,然后遍历主串即可。没成功匹配一次,计数器加一。实现代码如下:#include #include #include using namespace std;int next[1010];char a[1010],b[1010];void init_next(){ int i=0,j=-1; int le原创 2014-09-18 10:15:54 · 439 阅读 · 0 评论 -
HDU1358 Period KMP循环节问题
题目大意:给你一个字符串,让你求出从字符串的第2个字符开始,其长度为i的前缀中有多少个循环体大于1的循环节。分析:KMP的next数组循环节问题。遍历字符串中的每一个位置,逐一判断即可。字符串满足next[ i ]!=0&&i%(i-next[ i ])==0时存在循环节,且循环体大小为(i-next[ i ])。#include #include #include us原创 2014-09-16 14:25:15 · 569 阅读 · 0 评论 -
KMP算法next数组的循环节问题
next数组在求解的过程中,用到了KMP的思想,当前失配了,就回溯到上一个next,请见 j=next[j] ,先说个结论,如果到位置 i ,如果有 i%(i-next(i))==0 , 那说明字符串开始循环了,并且循环到 i-1 结束,为什么这样呢?我们先假设到达位置 i-1 的时候,字符串循环了(到i-1完毕),那么如果到第i个字符的时候,失配了,根据next数组的求法,我们是不是得回原创 2014-09-16 14:36:43 · 966 阅读 · 0 评论 -
HDU3746 Cyclic Nacklace
#include #include #include using namespace std;const int MAX=100010;char str[MAX];int next[MAX];void init_next(){ int i=0,j=-1; int len=strlen(str); next[0]=-1; whi原创 2014-09-17 14:15:42 · 503 阅读 · 0 评论 -
字符串匹配之KMP算法
以前零零散散做了些KMP的题目,一直也没找出时间整理,这一段又开始研究字符串了,就顺便把KMP整理了一下。废话不说了,我们直接入题。 说到KMP,首先应该知道,它是一种字符串查找算法,因为是由一个姓K,一个姓M和一个姓P的人联合发表的,所以就叫KMP算法了。KMP算法是一种线性时间的的字符串匹配算法,能在O(m+n)的时间数量级上完成字符串的模式匹配操作。它对简单的模式匹配(就是暴力==原创 2015-04-22 17:44:14 · 640 阅读 · 0 评论 -
HDU1686 POJ3461 Oulipo KMP算法
题目大意:给你两个字符串,让你求出第一个字符串在第二个字符串中出现多少次。分析:KMP算法,每次匹配成功时让计数器加1即可。实现代码如下:#include #include #include using namespace std;const int MAX=1000010;const int MIN=10010;char T[MAX],W[MIN];int ne原创 2014-09-16 10:38:50 · 752 阅读 · 0 评论 -
HDU2137 circumgyrate the string 模拟题
circumgyrate the string#include #include #include using namespace std;int main(){ char str[100]; int n,i,j; while(scanf("%s%d",str,&n)!=-1) { if(n>=0) n%=8原创 2014-11-07 21:00:32 · 512 阅读 · 0 评论 -
字符串排序(qsort函数用法小结)
首先说一下字符串的排序:代码(1):#include #include #include #include using namespace std;#define MAXN 1000#define N 100int cmp(const void *a,const void *b){ return strcmp((char*)a,(char*)b);原创 2015-01-27 14:16:57 · 3383 阅读 · 0 评论 -
POJ2752 Seek the Name, Seek the Fame KMP-next数组的应用
题目大意:给你一个字符串,让你找出既是前缀同时又是后缀的子串在主串中的位置,如果有多个,按升序输出。分析:考察KMP算法中对next数组的理解。我们知道next[ j ]纪录的是字符串第j个位置之前的next[ j ]个连续的字符和该串的长度为next[ j ]的前缀是相同的。既然如此,要判断一个后缀是否等于前缀,只需看next[ len ]是否等于0即可,next[ len ]!=0原创 2015-04-23 19:21:32 · 393 阅读 · 0 评论 -
POJ2185 Milking Grid 最小覆盖子矩阵(二维KMP)
题目大意:有一个R×C规模的字符矩阵,求出最小的子矩阵,使该矩阵可以由子矩阵平移得到,输出子矩阵的大小。分析:很明显,符合条件的子矩阵(设该矩阵的规模为w×h)需要同时满足:(1)该子矩阵的h行可以看成h个字符串,原矩阵中任一行字符串都可以由这h个字符串中的一个平铺形成;(2)该子矩阵的w列也可以看成w个字符串,原矩阵中任一列字符串也都可以由这w个字符串中的一个平铺而成;原创 2015-04-24 13:56:08 · 1063 阅读 · 1 评论 -
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 · 532 阅读 · 0 评论 -
HDU1251 统计难题 tire树
题目大意:给你一系列字符串作为母串,对于若干次询问,每次询问包含一个字符串,输出该以字符串为前缀的母串的数目。分析:典型的tire树,在每次插入数据的时候纪录前缀数。实现代码如下:#include #include #include #include using namespace std;#define son_num 30 //字符串中包含的字符个数#d原创 2015-04-29 14:39:47 · 552 阅读 · 0 评论