KMP/extend-kmp
kalilili
双眼闭三年。
展开
-
HDOJ1358 Period (KMP next数组应用)
题意:n个字符的字符串,从第二个字符开始遍历。如果从第一个字符到当前字符是有循环的,那么输出当前的位置和最大循环次数。两组数据之间输出一个空格。所以我们需要先解决如何算出(1...x)串的最大循环次数,再遍历就ok所以如何找到最小循环节,如果(1...x)有循环x-next[x]就是循环节,可以在纸上画画,从前往后可以用“1...x-next[x]”这串字符推出整个串。而且这是最小循环节,原创 2015-02-17 20:37:31 · 1126 阅读 · 0 评论 -
POJ 2046 Power Strings(连续重复串重复次数--后缀数组)
连续重复串:如果一个字符串L 是由某个字符串S 重复R 次而得到的,则称L 是一个连续重复串。R 是这个字符串的重复次数。题意:求连续重复串的最大重复次数R思路:当然可以用kmp。用后缀数组的话,穷举字符串S 的长度k,然后判断是否满足。判断的时候,先看字符串L 的长度能否被k 整除,再看suffix(0) suffix(k)的最长公共前缀是否等于n-k。在询问最长公共前缀原创 2015-03-19 22:00:29 · 847 阅读 · 0 评论 -
HDU 3746 Cyclic Nacklace(KMP)
KMP求最短循环节的应用//2100 KB 218 ms #include#include#include#includeusing namespace std;#define M 100000+1000char str[M];int next2[M];int len;void getnext(){ len=strlen(str); int i=0,j;原创 2015-03-10 20:24:19 · 726 阅读 · 0 评论 -
HDU 4749 Parade Show(KMP变形)
题意:有一个文本数列,问可以匹配多少个模式数列(不允许重叠),但这里的“匹配”是这样定义:满足大小关系即可,比如(2,4,4,1)和(33,57,57,2)匹配思路:明显可以把文本数列和模式数列处理一下,用i与i+1的关系差值代替再KMP即可,KMP的时候由于不能重叠,所以匹配成功以后,文本串要向后移一位再接着匹配即可#include#include#include#includ原创 2015-03-26 13:00:38 · 1000 阅读 · 0 评论 -
HDU 4300 Clairewd’s message(初遇拓展KMP)
昨晚一不小心学了拓展KMP,被虐了一晚,最终是这份资料救了我...http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html说得简单易懂。然后学了kuangbin的模版:/* * 扩展KMP算法 *///next[i]:x[i...m-1]与x[0...m-1]的最长公共前缀//extend[i]:y[i...n-1]与x原创 2015-02-20 14:48:23 · 702 阅读 · 0 评论 -
POJ-3461 Oulipo(KMP)
题目链接:http://poj.org/problem?id=3461题目大意:给你两个字符串p和s,求出p在s中出现的次数。思路:p在s中KMP匹配,匹配成功,再从next[last]的位置匹配即可,因为允许出现的两次有重叠的部分。//1208 KB 94 ms #include#include#includeusing namespace std;in原创 2015-02-17 21:03:40 · 562 阅读 · 0 评论 -
POJ3080-Blue Jeans(KMP,水)
大致题意:就是求k个长度为60的字符串的最长连续公共子串,2规定:1、 最长公共串长度小于3不输出2、 若出现等长的最长的子串,则输出字典序最小的串思路:和POJ-3450-Corporate Identity一样二分+枚举,但是直接暴力也0ms//192 KB 0 ms 题目太水,我就把POJ3450的代码改了几句话#includ原创 2015-02-17 21:17:45 · 959 阅读 · 0 评论 -
HDU 3613 Best Reward(求前后缀回文 拓展KMP or Manacher)
题目大意:给个字符串X,要把X分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串(从左往右或者从右往左读,都一样),那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0。问最多能获得多少价值?思路:把字符串X逆序后得到字符串Y让X去匹配Y ,匹配的长度满足extend[i] + i == len, le原创 2015-02-21 15:46:40 · 1809 阅读 · 0 评论 -
POJ 2185 Milking Grid (KMP) (好题)
题意:给你一个字符矩阵,求出它的最小覆盖子矩阵,即使得这个子矩阵的无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。和HDOJ1358 Period 一样,对于(1....x)串x-next[x]就是它自身的最小覆盖串,所以可以把每行的所有覆盖求出来,找到他们的最小值,即是最小覆盖子矩阵的宽,一些博客把每行的所有最小覆盖的公倍数求了出来,这样的确可以覆盖整个矩阵但不是最小覆原创 2015-02-17 21:33:28 · 934 阅读 · 0 评论 -
HDU1867:A + B for you again(KMP)
题意:找出一个最大的公共子串,这个子串是一个字符串的尾串(tail substring ),同时是另外那个字符串的头串(head substring),是满足A+B的长度strlen(A+B)达到最小值,这里面要注意的一个问题是,谁做模式串P是不一定的,所以要分别比较不同字符串作为模式的KMP值。思路:让两个串分别做模式串。看谁KMP的结束的时候匹配的字符字符的个数最多就好。当然也可以把两原创 2015-02-17 21:38:11 · 662 阅读 · 0 评论 -
POJ-3450-Corporate Identity(KMP)
题意:给你n个的串,求出它们的最长公共子串,如果不存在这个子串,则输出“IDENTITY LOST”,如果存在多个最长公共子串,则输出字典序最小的那一个。思路:二分枚举最长公共子串的长度,然后再枚举此长度的所有子串,找出字典序最小的解(不用二分直接暴力也能过)//400 KB 125 ms #include#include#include#includeusing namespace原创 2015-02-17 21:12:43 · 1180 阅读 · 0 评论 -
POJ 2406 Power Strings(KMP)
题意:给定一个字符串,让你求出他最多由几个相同的连续子串连接而成。和上一篇一样,上一题的弱化,不说了代码(直接套了上一题)//5060 KB 110 ms C++#include#include#include#define maxn 1000100using namespace std;int len;char str[maxn];int next[maxn];vo原创 2015-02-17 20:52:04 · 791 阅读 · 0 评论 -
POJ-2752 Seek the Name, Seek the Fame(KMP)
大致题意: 给出一个字符串str,求出str中存在多少子串,使得这些子串既是str的前缀,又是str的后缀。从小到大依次输出这些子串的长度。next的简单运用,递归打印next的值就好//Memory: 3656 KB Time: 141 MS#include#include#include#define maxn 400100using namespace st原创 2015-02-17 20:58:39 · 521 阅读 · 0 评论 -
Hdu 3336 Count the String(DP+KMP)(好题)
题意:对于长度为len的字符串,我们知道它包含有len个前缀,现在要你统计出这个字符串里面,包含这些前缀的总个数。思路:这题可以运用KMP的next数组来解,不过也太难想了吧orz,为了用next解这题想那么多也不算是很好的方法orz。如何根据next数组的性质来解这道题,next数组的值是当前子串的后缀与前缀匹配的个数,所以根据这个性质把题待求的对象改一下:求每种字母作为结尾的串在原原创 2015-02-17 19:55:37 · 690 阅读 · 0 评论 -
FZOJ Problem 2183 简单题
Problem 2183 简单题 Accept: 64 Submit: 289Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description现在有一些被简单压缩的字符串,例如:a[120]代表120个a。对于字符串acb[3]d[5]e相对于acbbbddddde现在给你两个字符串c原创 2015-03-23 22:53:11 · 684 阅读 · 0 评论