参考:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html总结一下,如果对于next数组中的 i,符合i % ( i - next[i] ) == 0 && next[i] != 0 ,则说明字符串循环,而且循环节长度为: i ....
分类:
其他好文 时间:
2015-06-26 09:10:00
阅读次数:
128
感觉这个题好神啊。首先我们只管 $a = b$ 的情况,那么我们自然就可以把这个串对 $a$ 取模,然后用 KMP 求出能弄出几个其他的 B 串。具体就是把串先倍长,然后倒过来,然后求 $Next$ 数组,然后从 $2n$ 开始沿着 $Next[]$ 跳,直到跳到 $\le n$ 的时候停止,看哪些...
分类:
其他好文 时间:
2015-06-18 19:35:10
阅读次数:
178
题意:在一个序列中找到一个连续的子序列,返回其开始位置。思路:每个数字当成1个字符,长的序列是原串,短的序列是模式串,求next数组后进行匹配。 1 #include 2 #include 3 #include 4 using namespace std; 5 const int N=1000...
分类:
其他好文 时间:
2015-06-03 23:14:15
阅读次数:
197
一直以来,对算法都是理论大于实际,甚至没有实际.
最近由于项目需要.从新了解了一下KMP算法.唉,讨厌这种被动的学习过程.
不过KMP算法还是很有意思的,用了两天的时间才总算是弄懂了.期间参考了网上的博文和数据结构.下面分享一下KMP算法的心得.
KMP的总体思想是利用模式串本身的特性来优化匹配的步骤.如何利用自身的特性呢,KMP借助一个数组来实现,也就是大多数教程中提到的next数组.后面...
分类:
编程语言 时间:
2015-06-01 06:12:29
阅读次数:
177
题意:给你一个密文和明文的对应表以及一个密文+明文的字符串,明文可能只出现前面的一部分(也就是说是原明文的前缀),求最短的明文。思路:首先密文的长度至少占到一半,所以先把那一半解密,问题转化为找一个最长的后缀使得和前缀相等,并且满足后缀长度不超过原串的一半,显然用next数组即可解决。 1 #pr....
分类:
编程语言 时间:
2015-05-22 21:03:34
阅读次数:
109
树状数组/前缀和 Orz lct1999 好神的做法。。。 先看下暴力的做法:对于区间[l,r],我们依次扫过去,如果这个数是第一次出现,那么我们种类数+1。 我们发现:区间中相同的几个数,只有最左边那个才对答案有贡献。 那么我们O(n)预处理一个next数组,满足a[i]=a[next[...
分类:
其他好文 时间:
2015-05-19 18:17:19
阅读次数:
126
KMP的具体算法讲解可以参考此博文http://blog.csdn.net/v_july_v/article/details/7041827KMP算法的应用http://poj.org/problem?id=2406首先求得next数组若基础字符串为t,输入字符串为s,若s=t^n;那么下面的等式必...
分类:
其他好文 时间:
2015-05-16 18:04:51
阅读次数:
111
传送门在这里
题意:给出一个字符串的一个子串,告诉你子串在某些位置和原串匹配,求一共有多少可能的原串
思路:其实就是要判断给出子串的所有前缀和后缀哪些是相等的。
首先kmp的next数组求的是所有前缀子串(a1 a1a2 a1a2a3...)中长度最大的前缀和后缀的长度,
设字符串长度为len,那么next[len]得到的是整个字符串中长度最长的相等的前缀和后缀,并且可知,所有起始位置...
分类:
其他好文 时间:
2015-05-13 19:57:22
阅读次数:
153
我们在一个母字符串中查找一个子字符串有很多方法。KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度。当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容。在KMP算法中有个数组,叫做前缀数组,也有...
分类:
编程语言 时间:
2015-05-08 10:49:53
阅读次数:
141