
----- 字 符 串 -----
ITCharge
高效率编程,慢节奏生活。
展开
-
KMP【模板】
当字符串匹配失败时,模式串的指针并没有指向0从头比较,而是指向了一个特定的位置,因为这个Next[j]指向的位置pos前长度为Next[pos]的子串,同模式串第j位前的长度为Next[j]的子串是相同的。 即S[0]~S[Next[j]]一定与S[len-1-Next[j]]~S[j-1]匹配。 1.既能做前缀又能做后缀的子串长度 ans[0] = len; int id原创 2015-05-03 22:53:42 · 899 阅读 · 0 评论 -
HDU1004 Let the Balloon Rise【字典树】
题目大意:ACM比赛要统计所有队伍最初哪道题的数量最多。给你N个代表气球颜色的字符串。输出出现次数最多的气球颜色。题目保证每组数据结果是唯一的。思路:有两种方法来做。1)可以用普通的二维字符串数组存放气球颜色,然后两重for循环求出每个气球的个数。用一个整型数组存放每个气球的个数。最后求出个数最多的气球,输出字符串。2)用字典树将所有的气球颜色字符串存起来,并统计字符串出现的次数。然后找到最多的气球字符串,进行输出。原创 2015-04-21 20:14:11 · 818 阅读 · 0 评论 -
poj3461 Oulipo【KMP】
题目大意:给一个字符串T,表示文章,再给一个字符串W,表示单词。T和W都只包含26个大写英文字母。现在计算单词W在文章T中出现的次数。W在T中出现的次数必须连续完全匹配,没两次匹配可能有重叠的部分。思路:先求出字符串W的Next[]指针,然后进行匹配,当一次匹配成功后,继续回退到Next[j]向后进行匹配,直到字符串T的末尾。此时,得到的匹配成功次数为所求,即W在T中出现的次数。原创 2015-04-21 10:41:03 · 966 阅读 · 0 评论 -
POJ2185 Milking Grid【KMP】
题目大意:有一个N行M列的字符矩阵,这个字符矩阵可以由较小的矩阵重复平铺组成整个矩阵。问:最小的字符子矩阵的面积为多少。思路:对于长度为M的每一行s[i]来说,M-Next[M],M-Next[Next[M]],…都是能通过复制,完全覆盖字符串的可行串,而M-Next[M]是最小的。遍历每一行,求出对所有s[i]都可行的最小字符串长度,即每一行M-Next[M]的最小公倍数lcmn。再用类似的方法求出长度为N、对每一列都可行的最小字符串高度,即每一列N-Next[N]的最小公倍数lcmm。则原创 2015-04-21 19:49:14 · 1098 阅读 · 1 评论 -
HDU1358 Period【KMP】
题目大意:给你长度为N的字符串s,求字符串s的循环前缀的长度和循环的次数。例如:长度为8的字符串:"abababab"长度为4的前缀"abab",循环前缀为"ab",循环2次长度为6的前缀"ababab",循环前缀为"ab",循环3次长度为8的前缀"abababab",循环前缀为"ab",循环4次则输出:4 26 38 4思路:KMP算法中Next[j]求的是第j个位置失配之后返回的匹配位置,即S[0]~S[Next[j]]与S[j-1-Next[j]]~S[j-1]是相同的,对于原创 2015-04-26 10:40:14 · 933 阅读 · 0 评论 -
HDU1251 统计难题【字典树】
题目大意:给你一张单词表,每个单词占一行,以空行结束。再给你几个单词前缀。那么问题来了:统计出单词表中以所给单词前缀为前缀的单词数目。思路:其实就是字典树的模板应用。根据所给单词表建立一个字典树,并记录所有前缀的个数。然后根据所给单词前缀去字典树中查找是否含有这个前缀。找到就输出该前缀的个数。原创 2015-02-14 22:13:50 · 927 阅读 · 0 评论 -
POJ2752 Seek the Name, Seek the Fame【KMP】
题目大意:给定一个字符串S,计算出所有可能的前缀-后缀字符串的长度。前缀-后缀字符串指的是S的子串不仅是S的前缀,还是S的后缀。比如S = "alala",前缀-后缀字符有{"a","ala","alala"}。思路:KMP算法的应用。在KMP算法中,当字符串匹配失败时,模式串的指针并没有指向0从头比较,而是指向了一个特定的位置,因为这个Next[j]指向的位置pos前长度为Next[pos]的子串,同模式串第j位前的长度为Next[j]的子串是相同的。为了找到既能做前缀又能做后缀的子串,纳原创 2015-04-21 09:26:58 · 725 阅读 · 0 评论 -
POJ2406 Power Strings【KMP】
题目大意:给定两个字符串a和b,定义a*b为两个字符串的链接。比如,a = "abc",b = "def",则a*b ="abcdef"。这个定义当作是多项式。则一个字符串的非负整数次幂可定义如下:a^0 = "",a^(n+1) = a*a^n。现在给你一个字符串s,求出最大的n,满足s = a^n(a为s的某个子串)。比如s = "aaaa",则n最大为4,a = "a",s = "a"^4。思路:对于给定的字符串s,最短的重复子串a是s[Next[len]] s[Next[len+1]原创 2015-04-21 10:21:48 · 735 阅读 · 0 评论 -
HDU1671 Phone List【字典树】
题目大意:给你N个字符串,判断这N个字符串中是否存在一个字符串是另一个字符串的前缀,如果存在就输出"NO",否则输出"YES"。思路:建立一个字典树,将N个字符串存入字典树中,统计前缀出现次数。再查找这N个字符串,如果出现字符串出现次数>1,则说明重复出现了两次,就输出"NO"。如果都每出现,则输出"YES"。这道题如果每次都不删字典树,清除空间的话,会超内存。所以加上清空字典树的操作。原创 2015-04-26 11:48:47 · 843 阅读 · 0 评论 -
字典树【模板】
struct TrieNode{ int Count; struct TrieNode* Next[26];}Tree,*Trie;TrieNode *root;void Create() //初始化{ root = new TrieNode; memset(root->Next,NULL,sizeof(root->Next)); root-原创 2015-04-15 10:07:46 · 896 阅读 · 0 评论 -
POJ2503 Babelfish【map】
题目大意:给你一本字典。字典上每一行为一个英语单词和一个其他国家单词。这样我们就可以通过字典把英语单词翻译成其他国家单词,也可以将其他国家单词翻译为英语单词了。现在再给你几个外国单词,问:字典中是否有这个单词的翻译。如果有,就输出翻译,否则,输出"eh"。思路:这道题其实可以用STL中的map或是字典树来做。map的做法是,建立两个map,一个对应存放翻译,一个用来判断翻译是否存在。注意输入可以先将一行输入进来,判断是否为"\n"。再用sscanf将英语单词和其他国家单词拆分为两个字符串s,原创 2015-04-26 16:24:07 · 1015 阅读 · 0 评论 -
HDU1800 Flying to the Mars【字典树】
题目大意:有N个士兵。用不同的整数表示不同的级别。级别高的士兵可以教级别低的士兵,他们可以共用一把扫帚。一个士兵最多只能有一个学生或一个老师。问:最少需要几把扫帚。思路:对于士兵都不相同的士兵,只需要一把扫帚。那么问题转变为找出给出数理重复次数最多的个数。建立字典树,将每个数当作字符串插入字典树中,记录每个数出现的次数,最后找出重复出现次数的最大值即为所求。注意:04和4都表示4,插入的时候,应该清除掉前导零。原创 2015-04-22 10:38:30 · 984 阅读 · 0 评论 -
KMP【模板】
char str[1000010],pat[1000010];//pat为模式串,str为主串int Next[1000010]; //Next[x]下标x表示匹配失败处字符下标//模式串pat的前缀与x位置的后缀的最大匹配字符个数-1void GetNext(char *pat){ int LenPat = strlen(pat); int i = 0,j = -1;原创 2015-04-28 18:27:40 · 1058 阅读 · 0 评论 -
HDU2222 Keywords Search【AC自动机】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222题目大意:给你 N 个模式串,和一个文本串。问:文本串中共出现了几个模式串。思路:这道题是 AC 自动机的基础题目。就是求文本串中出现的模式串个数。用 Val[] 数组来标记模式串。最后用 ans 累加模式串个数。AC代码:#include...原创 2019-12-05 14:12:08 · 873 阅读 · 0 评论 -
HDU1247 Hat’s Words【字典树】
题目大意:一个"hat's word"是一个单词,可以恰好由字典中其他两个单词连接得到(比如字典中是hat's和word)。给出字典中的单词,输出所有的hat's word。思路:建立字典树,将每个单词都插入到Trie树中,Count统计单词(不是前缀)出现次数。按顺序将每个单词所有可能的长度拆分成前缀单词和后缀单词,判断这两部分是否都在字典树中,是就是hat's word,进行输出,否则继续拆分当前单词或下一单词。原创 2015-04-22 11:45:28 · 965 阅读 · 0 评论 -
POJ2001 Shortest Prefixes【字典树】
题目大意:给一些字符串,求出每个字符串在这些字符串中能可以被唯一识别的最小前缀。思路:字典树的模板题,结构体中庸Count来存储字符前缀出现的次数,字典树中找到第一个Count为1的前缀时,该前缀就是被唯一识别的最小前缀。原创 2015-04-15 09:40:26 · 897 阅读 · 2 评论 -
HDU2203 亲和串【KMP】
题目大意:给定亲和串的定义:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。现在给你两个字符串s1和s2,判断s2是否是s1的亲和串。思路:先判断s2的串长度是否小于等于s1的长度,因为如果s2的串长度比s1还要长的话,s2是不可能是s1的亲和串。然后在s1的串后边在街上s1的串,对s1和s2进行KMP算法,看s1的串中是否包含s2的串,如果包含,则s2就是s1的亲和串,否则就不是亲和串。原创 2015-04-26 09:32:34 · 996 阅读 · 0 评论 -
HDU2896 病毒侵袭【AC自动机】
题目大意:给你N个模式串(编号为1~N)。接下来给你M个主串。问:主串中出现的模式串的编号。思路:和HDU2222一样。都是求文本串(主串)中出现的模式串。不同的是这道题要求输出的是模式串的编号。用Val[]来保存模式串的编号id。同时注意字符为ASCII码可见字符,即32~127共95个。其实定义95就可以了,我这里定义了128,不过没什么影响。原创 2015-05-23 00:05:50 · 1091 阅读 · 0 评论