kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式串用next数组进行跳转到符合的位置,而目标串不需要再往回匹配,为什么是最长的相同的前缀后后缀呢? ...
分类:
编程语言 时间:
2016-03-30 23:56:55
阅读次数:
225
【题目大意】[依然借用别人的概括]给定一个长为L的字符串(L<=100W),求一个num数组,num[i]表示长度为i的前缀中字符串S’的数量,其中S‘既是该前缀的前缀也是该前缀的后缀,且|S'|*2<=i【思路】KMP中next数组的变形。先算一次next数组和dep数组,其中dep数组表示当前前 ...
分类:
其他好文 时间:
2016-03-26 20:25:30
阅读次数:
169
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3746 题目描述: 给定一个字符串S,问至少需要添加多少个字符,使得新字符串拥有两个以上的循环节。 解题思路: 又一个next数组的应用(由于next数组在C++内不能使用,所以我使用失配数组也即fai
分类:
其他好文 时间:
2016-03-19 00:54:34
阅读次数:
221
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1355 题目大意: 对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串 题解:这题就是KMP next数组的应用啦(水),最小值就是n-n
分类:
其他好文 时间:
2016-03-15 18:53:57
阅读次数:
175
文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。 KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧。 计算前缀 Nex
分类:
其他好文 时间:
2016-03-10 16:08:33
阅读次数:
132
一个原始字符串,一个未知字符串,每一次从pos[i]开始覆盖未知字符串,问最后字符串的形式,以及判断过程中是否有矛盾。 过程中pos是升序的,所以如果任意连续两次操作,如果覆盖范围不重叠,则没事,否则需要判断原始字符串某一个后缀是否同时也是前缀。这个可以用next数组,z函数,后缀数组等计算。 1
分类:
编程语言 时间:
2016-03-05 20:16:55
阅读次数:
310
1 /* next数组是KMP算法的关键,next数组的作用是:当模式串T和主串S失配 2 * ,next数组对应的元素指导应该用T串中的哪一个元素进行下一轮的匹配 3 * next数组和T串相关,和S串无关。KMP的关键是next数组的求法。 4 * 5 * ———————————————————
分类:
编程语言 时间:
2016-03-04 23:59:08
阅读次数:
527
大意:给一个字符串,问最长的既是前缀又是后缀又是中缀(这里指在内部出现)的子串。 我自己的做法是用KMP的next数组,对所有既是前缀又是中缀的位置计数,再从next[n]开始走next,也即枚举所有既是前缀又是后缀的子串,看cnt[i]是否大于0,如果大于0则说明作为中缀出现过(也即有大于i的某个
分类:
其他好文 时间:
2016-03-01 22:22:03
阅读次数:
277
思路: 这题被坑的不轻。 首先花了一段时间想明白了思路是要找出现次数最多数字,以为这题就这样解决了,结果发现每个数字的最大长度是30,long long都装不下,因此就要用字符串来保存处理。然后在insert的时候进行一下计数就可以了 最关键的地方是struct内的构造函数中,在初始化next数组的
分类:
其他好文 时间:
2016-02-20 12:00:00
阅读次数:
171
源代码: #include<cstdio> #include<cstring> #include<iostream> using namespace std; string s1,s2; int m,n,k(0),next[1001]; //在Next数组中,存储的是匹配失败后,上一位应该跳跃到的节
分类:
编程语言 时间:
2016-02-15 22:29:41
阅读次数:
199