KMP
文章平均质量分 74
NightRaven
cust
展开
-
hdu4468 spy KMP
一个字符串s,令r等于s,然后砍掉r的一个后缀(可以砍0个字符)再在后面拼上s,然后再砍掉r的一个后缀,再拼接s...如是好多次,得到最终串r.现在给你最后的串r,问初始的s最短可以是多长。题目保证每个字符串不超过10^5,全部数据总长不超过2*10^6.看到单组10^5,一开始感觉可能是个后缀数组,后来又往后缀自动机上去想。写了个二分后缀长度+SAM判定的果断T掉了= =,最后写成了KMP -.原创 2013-10-06 19:18:13 · 1060 阅读 · 3 评论 -
poj3080,poj3450 多个字符串求最长公共子串问题 KMP,SA,SAM:
这两题都是给若干个字符串,求他们的最长公共子串,这类题可以KMP,后缀数组,后缀自动机都可以做,前两个复杂度是O(NlogN),最后一个理论上是O(N),后缀自动的做法参考spoj上这个题:http://blog.csdn.net/night_raven/article/details/12438039。 3080只有10个串,长度为60,用后缀数组的话,就把所有串串起来,求出heig原创 2014-03-09 22:28:23 · 1056 阅读 · 0 评论 -
poj2752 Seek the Name, Seek the Fame KMP
给一个字符串,求出所有前缀-后缀子串的长度,前缀-后缀子串定义为一个子串同时是母串的前缀和后缀。建好失配指针后,直接从末尾开始沿失配指针走一遍走到头就行,因为从ed转移到f[ed]得话,f[ed]---ed这段一定同时为后缀和前缀,而若i=f[ed]不为零,又有f[i]---i同时为原串的前缀和后缀,所以递归一边就能得到答案。#include #include #include #inc原创 2014-03-09 20:12:33 · 596 阅读 · 0 评论 -
poj2185 Milking Grid 二维kmp
给一个字符矩阵,求一个最小的矩阵,使得这个矩阵复制若干次可以完整包含原矩阵。首先考虑行,找出每行的最小重复单元的长度后,他们的最小公倍数就是横向上的最小单元长度;同理纵向上求出纵向上的最小单元长度,要注意的一点是如果这两个长度大于n或m得话,就取n或m,因为最长也就是他们本身的长度..那么现在的问题就是求一行(或一列)的最小重复单元了,求出该行的失配函数,len-f[len]就是这一行的最小重复单原创 2014-03-09 20:38:56 · 719 阅读 · 1 评论 -
codeforces 126B Password KMP
给一个串,求一个最长子串同时是母串的前缀,后缀,并且在前缀后缀之外有出现了一次。 首先构造好失配函数,从len开始沿失配路径走一遍并且标记沿途节点,为什么要标记,因为如果节点i在这条失配路径上,那么f[i]---i这个子串一定同时为母串的前缀和后缀,之后我们只要从len-1(排除后缀)到0枚举一边,在已标记的节点中找一个最大值就行。#include #include原创 2014-03-10 20:43:59 · 586 阅读 · 0 评论 -
hdu3336 &&hdu 4552 KMP ,SAM
给一个串,求所有前缀在母串中出现的次数和。 还是利用失配函数来做,构造完失配函数,然后从末尾向前枚举,对于每个点,如果没有被访问过的话,就沿其失配路径走一遍,并且每经过一个未访问过节点,迭代层数+1(初始为0),若经过的是已经访问的节点,那么迭代层数不变;同时标记该点已访问,这个点为末尾的前缀出现的次数+当前迭代的层数,然后转移到向下一个点;对KMP的失配函数深入了解一点的话,这个思原创 2014-03-10 20:56:26 · 549 阅读 · 0 评论 -
HDU 3746 Cyclic Nacklace KMP
给一个字符串,给它增加x位可以变成一个由某个前缀重复2+次构成的串,求最小的x。 如果做过白书上KMP找寻环节那个题的话,这题就没难度了...n-f[n]就是最小循环节的长度,那么我们枚举一下倍数,在k*(n-f[n])刚好>n的时候,输出他们的差即可。#include #include #include #include #include using namespace原创 2014-03-10 21:07:13 · 576 阅读 · 0 评论 -
poj3167&hdu4749 KMP+BIT
一道比较好玩的KMP,他在匹配的时候不是按该位字符是否想到,而是按当前字符的名次来判断是否匹配,转化一下就是对i,j,若i之前中比s[i]小的和j之前中比s[j]小的数的个数相等并且i之前小于等于s[i]的数和j之前小于等于s[j]的个数相等,那么就判定s[i]和s[j]匹配。以此方法构造状态转移图后,拿母串跑一遍即可。维护的过程可以用树状数组实现。hdu4749那个和poj3167基本一样,最后原创 2013-10-15 11:25:21 · 864 阅读 · 0 评论 -
hdu4763 Theme Section KMP
给一个字符串S,问是否存在一个子串s'同时为s的前缀,后缀,并且至少出现在前缀后缀之外的位置一次(互不重叠)。10^6的数据...一开始想写后缀数组,看这数据估计是要卡倍增,DC3又没写过..后来想了想直接KMP扫一遍好像就行..以末尾为起点,遍历从失配路径上的每一个点,如果f[j]小于len/3,那么就从2*f[j]+1~len-f[len] 之间枚举k看是否存在f[k]==f[j],存在的话答原创 2013-10-01 21:08:13 · 655 阅读 · 0 评论 -
poj2406 Power Strings kmp
一个字符串可以由他的一个子串a重复n次得到,现在给一个长度不大于10^6的字符串,求最长n。 跟白书上的period (训练之南P213,例13)基本一样甚至还简单一点。核心就是利用KMP中的失配函数求最短循环节。可以得到对于字符串的第i位,若有i % (i-f[i])==0,则f[i]到i之间的部分及为这个串的最短循环节,具体画个图,或者参考白书上的图,很容易就能看出来。原创 2013-09-29 19:25:19 · 656 阅读 · 0 评论 -
UVA 11475 Extend to Palindrome KMP,后缀数组
给一个字符串,尽可能少的添加字符使他变成一个回文串,求添加之后的回文串。 这题kmp,后缀数组都能做,大体思路就是找一个最长的回文后缀,那么要添加的字符就是字符串除掉这个后缀后剩下的前缀了。找的时候可以反向拼接,构造后缀数组然后二分长度+遍历height判断;或者直接把原串接在翻转串的后面,求一下失配函数。不管是效率还是实现,感觉都是KMP好一点....KMP的代码:#inclu原创 2014-03-16 15:00:23 · 833 阅读 · 0 评论