
KMP
ITCharge
高效率编程,慢节奏生活。
展开
-
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 评论 -
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 评论 -
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 评论 -
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 评论 -
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 评论 -
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 评论 -
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 评论 -
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 评论