
KMP
lajiyuan_
已经退役啦,会不定期更新cf博客 or 其他计算机知识相关的博客.
展开
-
KMP模板以及简单的入门题总结
KMP模板//kmp算法的主要作用在于对next数组的运用,所以这里只给出next数组的模板//性质1:对于每一个长度len的子串,该子串的最小循环节为len-next[len]//性质2:kmp的next不断向前递归的过程可以保证对于每一个当前前缀,都有一段后缀与之对应#include<stdio.h>#include<iostream>using na...原创 2018-05-29 20:19:25 · 3918 阅读 · 4 评论 -
【FZU 1901 Period II 】KMP
FZU1901 本题题意为求一个长度PPP,使所有的iϵ[0,size(s)−p−1]iϵ[0,size(s)−p−1]i\epsilon \left[ 0,size\left( s \right) -p-1 \right] 满足S[i]=S[i+P]S[i]=S[i+P]S[i]=S[i+P] 本题考验next数组的理解运,在此重复一遍,kmp的next不断向前递归的过程可以保证对于每...原创 2018-05-30 10:04:28 · 194 阅读 · 0 评论 -
【HDU 3374 String Problem 】 KMP&最小表示法
HDU3374 本题题意为求一个字符串旋转后的所有串中字典序最大和字典序最小分别出现的次数。 搜先我们要了解字符串的最小表示法o(n)o(n)o(n)的时间复杂度求出旋转后字典序最小的起始下标。 最小表示法戳这里字符串最小表示法 了解了最小表示法之后,我们考虑一下,会发现,只有字符串有循环节的时候才会出现旋转后有相同的串出现的情况,所以我们利用KMP判断是否字符串存在循环节(这里不懂的请看...原创 2018-05-30 10:04:42 · 153 阅读 · 0 评论 -
【HDU 4300 Clairewd’s message 】 KMP
HDU4300 本题题意比较难读懂,题意为给你一段密文的映射方式和一段密文+明文的字符串,密文是完整的,而明文不一定是完整的,让你添加最少的字符使他变为完整的密文+明文 如果读懂题意,可以考虑给定字符串中密文长度一定是>=len/2>=len/2>=len/2的,所以我们可以将后半段的字符均按照映射换为密文,然后找到最长的既在前缀中出现又在后缀中出现的子串,根据next数组的性质(...原创 2018-05-30 10:05:08 · 142 阅读 · 0 评论 -
【HDU 3336 Count the string 】 KMP
HDU3336 本题题意为求字符串的每个前缀在整个字符串中的出现次数。 如果next[j]对答案有一个贡献,那么这个贡献在j中一定会再贡献一次,而且j为结尾的字符串对于总串产生的贡献只有长度为j的子串,(如果这个性质不懂,可以去看我的KMP总结专题性质二)于是我们可以得到转移方程ans[j]=ans[next[j]]+1ans[j]=ans[next[j]]+1ans[j]=ans[next[...原创 2018-05-29 20:38:22 · 190 阅读 · 0 评论 -
【HDU 2594 Simpsons’ Hidden Talents 】 KMP
HDU2594 本题题意是求既是A串中的前缀又是B串中的后缀的最长长度。 如果我们将AB进行拼接,我们可以发现next[len1+len2]next[len1+len2]next[len1+len2]即为最长的即使前缀又是后缀的子串,但是这里有一个细节,就是如果这个长度大于min(len1,len2)min(len1,len2)min(len1,len2),代表这个是拼接之后产生的,是不可取的...原创 2018-05-29 20:36:11 · 144 阅读 · 0 评论 -
【POJ 3080 Blue Jeans 】 KMP/后缀数组
POJ3080 本题题意为求m个字符串长度至少为3的最长公共子串 由于m只有10而且len小于60,我们可以选择枚举某一个串的子串并用str.find()或者kmp验证是否所有该子串在所有字符串中出现过,也可以用经典的二分长度将height数组分块的后缀数组做法 POJ3080(find解法//由于只查找是否出现过,算法复杂度差距不大,所以这里给出简单一些的写法#include&l...原创 2018-05-29 20:34:31 · 232 阅读 · 0 评论 -
【POJ 2752 Seek the Name, Seek the Fame 】 KMP
POJ2752 本题题意为求出所有在后缀中出现过的前缀的最后一个元素的下标 本题要考虑一下next数组的本质,其实就是最长的出现在后缀中的前缀,但是由于本题要求所有的而不是最长的,考虑到next数组的递归过程,其实就是对每一个当前长度的前缀,都有完全相同的后缀与之对应,所以就不断递归next数组即可求解。 POJ2752代码#include<stdio.h>#inclu...原创 2018-05-29 20:33:14 · 162 阅读 · 0 评论 -
【HDU 1358 Period 】 KMP
HDU1358 本题题意为求给定字符串中所有为循环串的前缀,并输出该前缀的最后一个字符下标和周期 用到模板中给定的方法,只要对每个字符串判定一下是否为循环串就可以了 HDU1358代码#include<stdio.h>#include<iostream>#include<string.h>using namespace std ;const...原创 2018-05-29 20:31:29 · 139 阅读 · 0 评论 -
【HDU 3746 Cyclic Nacklace 】 KMP
HDU3746 本题题意为添加最少的字符使原字符串变成周期至少为2的循环字符串 用到模板里所说的,长度为len的字符串的最小循环节为len-next[len],求出最小循环节,算出最后应该补充多少就结束了。 求最小循环节的证明法请看此链接KMP求字符串最小循环节 HDU3746代码#include<stdio.h>#include<iostream>#inc...原创 2018-05-29 20:30:16 · 130 阅读 · 0 评论 -
【HDU 2087 剪花布条 】 KMP
HDU2087 题意就是求B串在A串中的出现次数(不可重叠) 做法和上题类似,只不过在每次完成匹配之后,要考虑不能重叠的问题,所以j不能跳转到next[j],而应该从0重新开始,因为A中已经匹配过的字符不能再利用,所以就变成了A剩下的子串中找B出现的次数,所以j应该从0重新开始匹配。 HDU2087代码#include<stdio.h>#include<iostr...原创 2018-05-29 20:29:17 · 168 阅读 · 0 评论 -
【HDU 1686 Oulipo】KMP/HASH
HDU1686 题意就是求B串在A串中的出现次数(可重叠 依旧是利用next数组,当某次匹配完成之后,将ans++,然后把j跳转到next[j],原理类似上一题的不匹配的情况,省略不必要的查找。 HDU1686代码#include&lt;stdio.h&gt;#include&lt;iostream&gt;#include&lt;string.h&gt;using namesp...原创 2018-05-29 20:28:18 · 247 阅读 · 0 评论 -
【HDU1711 Number Sequence】 KMP
HDU1711 题意就是给你两个序列,让你求B序列在A序列第一次出现(完全相同)的下标 本题就是KMP的模板题,将i指针指向A串,将j指针指向B串,如果匹配就继续下一位的匹配,如果不匹配,将j跳转到next[j],继续向前匹配。 HDU1711代码#include<stdio.h>#include<iostream>using namespace std ...原创 2018-05-29 20:21:23 · 176 阅读 · 0 评论 -
【UVA 11475 Extend to Palindrome】 KMP/manacher
UVA11475 本题题意是给你一个字符串,求出最少拼接字符数使其变为回文串KMP做法通过思考我们可以发现,只有作为后缀的回文串对结果产生贡献,那么这个题就转变为了找最长的后缀回文子串,我们将字符串倒置再拼接上原串,求得的next[len]也就是倒置字符串的前缀与原字符串的后缀的最大匹配长度,也就是本题答案。 UVA11475代码#include<stdio.h>...原创 2018-06-18 12:40:10 · 252 阅读 · 0 评论