KMP
Nicetomeetu-
没有
展开
-
POJ - 1961 Period KMP
传送门:点击打开链接 题意就是寻找一个字符串前缀的最短循环节,从而求出最大循环数。利用KMP算法可以求出Next数组,然后根据Next数组的定义,我们可以知道对于一个前缀S 1.如果i % (i - Next[i]) == 0,则S是有循环节的,循环节长度为i - Next[i]。 2.因为Next[i]表示最长前后缀,所以i - Next[i]是最短循环节。 3.Next[i]不能为0,原创 2017-08-21 16:27:31 · 502 阅读 · 1 评论 -
HDU - 1711 Number Sequence KMP
利用KMP算法匹配一个串T在另一个串S中首次出现的位置,套模板即可。 代码如下: #include using namespace std; const int N = 1000005; int S[N], T[N]; // 下标从0开始 int lens, lent; int Next[N]; // 下标从1开始 void getNext() { int i = 0;原创 2017-08-21 11:20:15 · 384 阅读 · 0 评论 -
POJ - 3461 Oulipo 初见KMP
【经典算法】——KMP,深入讲解next数组的求解 前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k;但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32章 字符串匹配虽然讲到<span style="line-height: 1.5;">了对前后缀计算的正确性,但原创 2017-08-21 11:03:37 · 440 阅读 · 0 评论 -
HDU - 6153 A Secret KMP或拓展KMP
传送门:点击打开链接 题意就是求一个串T的所有后缀在串S中出现的次数。将S,T都翻转之后就是求T的所有前缀在S中出现的次数。 拓展KMP:可以利用拓展KMP求出S的每一个后缀和T的最长公共前缀。假如当前最长公共前缀为k,就说明长度为k的前缀在S中出现了一次,并且这个k前缀不能构成k+1前缀。用一个cnt数组将各种长度前缀出现的次数记录下来。 来看一下第二个样例。 abababab aba原创 2017-08-22 11:01:00 · 488 阅读 · 0 评论 -
HDU - 4333 Revolving Digits 拓展KMP
传送门:点击打开链接 一个长度为lent的串T最多可以构造出lent个数字,所以这道题目的难点在于如何快速的将构造出的数字和原数字进行比较。 将两个T串合并成一个大的S串,构造出的数字实际上就是S的每一个后缀的前lent个字符。如何比较呢?如果S中从第i个位置开始的一个后缀和T的最长公共前缀k >= lent,那么这两个数字相等,如果k 通过叙述,很容易就知道要用到拓展KMP算法啦。 此原创 2017-08-21 23:48:23 · 354 阅读 · 0 评论