随笔分类 -  KMP---字符串匹配

后缀数组应用5: 求两个不同字串串的最长公共子串
摘要:求两个不同字串串的最长公共子串依然是将两个字串串拼接在一起。。然后求sa,height数组,最后枚举height值。。View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>using n 阅读全文

posted @ 2012-09-26 16:32 more think, more gains 阅读(185) 评论(0) 推荐(0)

后缀数组应用4: 求不可重叠最长重复子串
摘要:View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>using namespace std;#define MAXN 10010int sa[MAXN], rank[MAXN], su 阅读全文

posted @ 2012-09-26 16:16 more think, more gains 阅读(230) 评论(0) 推荐(0)

后缀数组应用3: 求子串个数
摘要:View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>using namespace std;#define MAXN 10010int sa[MAXN], rank[MAXN], su 阅读全文

posted @ 2012-09-26 16:14 more think, more gains 阅读(408) 评论(0) 推荐(0)

后缀数组应用2: 最长回文字串
摘要:算法:把字符串逆序拼接在第一个字符串后面,然后就是求最长公共前缀。。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>using namespace std;#define MAXN 10010int 阅读全文

posted @ 2012-09-26 16:13 more think, more gains 阅读(214) 评论(0) 推荐(0)

后缀数组应用之1:求最长公共子串
摘要:搞了一天,代码还未AC过题,自己打的测试数据过了。。算法:1. 倍增算法求sa,rank数组,时间复杂度O(nlgn).2. O(n)时间复杂度求height数组。。3. RMQ,预处理,时间复杂度O(nlgn)4.每次查询时间复杂度O(1)代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map 阅读全文

posted @ 2012-09-25 21:38 more think, more gains 阅读(327) 评论(0) 推荐(0)

Revolving Digits
摘要:算法:扩展KMP + KMP找循环节View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>#define MAXN 300010using namespace std;char S[MA 阅读全文

posted @ 2012-08-08 10:53 more think, more gains 阅读(151) 评论(0) 推荐(0)

AC自动机 HDU 2222
摘要:AC自动机分为三部分:1.构造字典树2.构找失败指针3.匹配解决的问题: 如给你n个单词,然后一篇问章,问你这篇文章中单词出现了多少次?View Code /*程序说明:多模式串匹配的AC自动机算法此题通过hdu 2222自动机算法可以参考《柔性字符串匹配》里的相应章节,讲的很清楚*/#include <stdio.h>#include <string.h>const int MAXQ = 500000+10;const int MAXN = 1000000+10;const int MAXK = 26; //自动机里字符集的大小 struct TrieNode{ Tr 阅读全文

posted @ 2012-08-08 07:52 more think, more gains 阅读(159) 评论(0) 推荐(0)

扩展KMP学习
摘要:1.扩展KMP要解决的问题 母串S,子串T,n = |S|,m = |T|,extend[i]表示S【i]与T最长公共前缀,要求在线性时间内求出extend[i]2.算法分析1)暴力算法,时间复杂度O( n * n ),比较N次,每次长度从N到1 2)扩展KMP, 时间复杂度O( n + m )扩展KMP:View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string& 阅读全文

posted @ 2012-08-07 22:20 more think, more gains 阅读(163) 评论(0) 推荐(0)

HDU 4300 Clairewd’s message
摘要:这题比赛时,题意看了N久才看懂,囧。。。算法又错了两次:错误算法:1. 用二分找密文长度。。2.用只求了一次next函数找最长前缀匹配后缀,忽略了其可能有交集,在这题中是不允许的。。正确算法:饶了这么多弯,终于回到正道了,求一次KMP就可以解决。用截获的文本后半段做主串,用前半段做模式串。用KMP求出其最长匹配主串的长度。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>char str[101000];char st[101000];char temp1[101000];char 阅读全文

posted @ 2012-07-20 22:22 more think, more gains 阅读(184) 评论(0) 推荐(0)

KMP 算法
摘要:KMP算法核心 next函数:1.定义: next[k] =1) k = 1时,next[k] = 0;2) = max( k | { 1 < k < j ) { p[1...k-1] = p[j-k+1...j-1] }3) 其他情况 next[k] = 12.递推求解1) 定义,next[1] = 0, 假设next[j] = k, p[1..k-1] = p[j-k+1..j-1]2) 若p[j] = p[k], p[1..k] = p[j-k+1..j], next[j+1] = next[j] + 1 = k + 1;3) 若p[j] != p[k],匹配失败时 k = 阅读全文

posted @ 2012-07-20 15:05 more think, more gains 阅读(211) 评论(0) 推荐(0)

导航