
KMP
kaiweisun
这个作者很懒,什么都没留下…
展开
-
poj 2406
字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一:让我们先来看基本的简单匹配算法: 先来看一个简单匹配算法的函数:int Index_BF ( char S [ ], char T [ ], int pos ){/* 若串 S 中从第pos(S 的下...原创 2012-06-25 21:23:27 · 102 阅读 · 0 评论 -
poj 1961
这题可以加深对KMP的懂得!题意:给出一个字符串,对于它的每个(each)前缀(prefix)长度 i (2<=i),求能由一个子串构成这个前缀的最大字串数量。看例子可以清楚些吧。我是看别人的才知道的。具体看以参考:http://jovesky.info/blog/2011/08/25/poj-1961-period-c-language-version/例子:字符串为aabaa...原创 2012-06-26 21:06:12 · 88 阅读 · 0 评论 -
poj 2752
题意:给你一个串,如果这个串存在一个长度为n的前缀串,和长度为n的后缀串,并且这两个串相等,则输出他们的长度n。求出所有的长度n。 思路:KMP中的get_next()。对前缀函数next[]又有了进一步的理解,str[1]~~str[next[len]]中的内容一定能与str[1+len-next[len]]~~str[len]匹配(图1)。然后呢我们循环地利用next,由于next的性质,...原创 2012-06-27 16:00:09 · 166 阅读 · 0 评论 -
poj 3461
题意:给你一个字串(模式串)和一个母串(文本),问字串在母串中出现的次数。 思路:最基础的KMP算法。在匹配完成一个之后,应该j=next[j],不能j=0,保证模式串在文本的所有种出现情况都包含到,这里注意下就可以了。代码如下:// #include<iostream>#include <iostream>using namespace std;...原创 2012-06-27 19:48:24 · 91 阅读 · 0 评论 -
poj 3080
题意:给你n个长度都为60的串,求出它们的最长公共子串,如果这个子串的长度 < 3则输出“no significant commonalities”,如果存在多个最长公共子串,则输出字典序最小的那一个。思路:枚举+KMP。枚举第一个串的所有后缀串(而不是枚举第一个串的所有子串),每一个后缀串做一次KMP,求出这些串的与其余所有串的最长匹配。#include<ios...原创 2012-07-05 10:48:05 · 102 阅读 · 0 评论 -
poj 3450
题意:给你n个的串,求出它们的最长公共子串,如果不存在这个子串,则输出“IDENTITY LOST”,如果存在多个最长公共子串,则输出字典序最小的那一个。思路:枚举+KMP。与poj3080类似,详情见poj3080#include<iostream>#include<cstring>using namespace std;const in...原创 2012-07-05 11:03:51 · 110 阅读 · 0 评论 -
poj 2185
题意:给你一个字符矩阵,求出它的最小覆盖子矩阵,即使得这个子矩阵的无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。思路:KMP很好的一道题。首先易证:最小覆盖子矩阵一定靠左上角。那么,我们考虑求出每一行的最小重复串长度,所有行的最小重复串的长度的lcm就是最小重复子矩阵的宽。然后我们对列也做相同的操作。于是我们就可以求得最小重复子矩阵的大小了。(这里要注意一点:当所得...原创 2012-07-05 15:10:34 · 80 阅读 · 0 评论