
ACM_KMP
文章平均质量分 57
京城一十三
你在凝视深渊的时候 深渊也在凝视着你
展开
-
POJ3080方法很多(暴力,KMP,后缀数组,DP)
题意: 给n个串(n>=2&&n思路:直接暴力,枚举+KMP,后缀数组枚举+KMP#include#includechar a[12][62] ,b[62];int next[62];void Get_Next(char b[]){ int m = strlen(b); int j = 0 ,k = -1; next原创 2015-06-04 16:42:43 · 647 阅读 · 0 评论 -
POJ2752KMP逆序处理
题意: 给你一个串,问你都哪些位置即使前缀又是后缀。思路: 可以用KMP来做,尝试过很多种方法,想把两个串接起来然后..失败,后来又想可以倒着匹配,就是把整个串倒过来..失败,说下第三种也是成功的方法,就是正常匹配,然后找到最后一个的next,如果是0,那么就不用找了,否则里面的数值是答案,然后再找next对应的那个数值,一直找到0,最后记得把总长度加上,正原创 2015-06-04 16:39:03 · 456 阅读 · 0 评论 -
POJ2406简单KMP
题意: 给一个字符串,求最大的前缀循环周期,就是最小的循环节对应的最大的那个周期。思路: KMP的简单应用,求完next数组后有这样的应用:next[i] :是最大循环节的第几位,比如123451234512那么就是7循环节是1234512345i-next[i] :最小循环节的位数if(next[i] && i % (next[i])==0)那么 i原创 2015-06-04 16:35:40 · 659 阅读 · 0 评论 -
3690状态压缩+暴力
题意: 给你一个矩阵,上面只有*和0(最大1000*1000),然后有t(最大100)组询问,每组询问给你一个小矩阵(最大50*50),问这t个矩阵中有多少个是在大矩阵中出现的。思路: 这个题目做的有点蛋疼,说下我的第一个思路,我的想法是把所有的数据都按照行去压缩成longlong的,因为最大50位状态压缩+暴力#includelong lon原创 2015-05-04 22:37:46 · 1077 阅读 · 0 评论 -
hdu3374最小表示法+KMP
题意: 给你一个最长100W的串,然后让你找到最小同构子串,还有最大同构子串的下标,最小同构子串就是把字符串连接成一个环,然后选择一个地方断开,得到的一个ASCII最小的子串(求最大同理),得到两个下标之后还要求两个数,就是最小子串出现的次数,还有最大子串出现的次数,就是所有循环移位后的到的len个子串中最小子串出现了多少次?思路: 求最小和最大小标这个可以原创 2015-02-06 16:33:40 · 503 阅读 · 0 评论 -
UVA11019KMP(二维矩阵匹配出现次数)
题意: 给你两个矩阵,一个大的一个小的,然后问你这个小矩阵在大的矩阵里出现了多少次?思路: 说好了AC自动机的,我自己尝试写了个暴力的KMP竟然过了,AC自动机自己的模板还没写完,就暂时没用,说下KMP的解法吧,首先我们考虑如果是一维的情况,是不是就直接KMP裸题了,那么我们就想办法把二维降成一维,我用的是比较笨的方法就是把每一数列看成一个字母(每次比较的时候要比较一数原创 2015-01-04 17:13:12 · 947 阅读 · 0 评论 -
差分约束 总结
如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi观察xj-xi**** 最短路求的最大 最长路求的最小原创 2014-06-01 17:25:43 · 619 阅读 · 0 评论 -
POJ 3461 KMP
题意: 给你两个字符串,问你串a在串b里面出现了多少次,可以重叠,比如aaa aaaaa 是3 ,不是1.思路: 就是在KMP的时候当匹配到比配串的最后一位的时候sum ++就行了,这里提示一下,这个题目说的是可以叠加,如果不可以重叠的,比如aaa aaaaa 输出的应该是1,为为子串不到6个,这样的我们在KMP匹配到匹配串最后一个的时候要把i++ ,j原创 2014-06-01 17:22:15 · 608 阅读 · 0 评论 -
POJ 2752 同一个串的前后串
题解东北赛回来z#include#includeint next[500000];int ans[500000];char str[500000];void get_next(int m){ int j ,k; j = 0 ,k = -1; next[0] = -1; while(j m) { if(k == -1 ||原创 2014-06-01 17:19:01 · 564 阅读 · 0 评论 -
POJ2406 KMP前缀周期
题意: 给你一个字符串,长度小于1百万,问你他最多可以拆成集合相同字符串,例如abcabcabc 可以拆成3个abc,所以输出3.思路: 这个是比较常规的next应用,首先假设当前字符串长度n;那么n - next[n]前缀为最短子串长度,如果n - next[n] != 0 && n / (n - next[n]) == 0,说明最后一个字符串是长度(原创 2014-06-01 17:16:24 · 816 阅读 · 0 评论 -
POJ 1961 KMP(当前重复次数)
题意: 前缀重复次数,举个例子,aaa 2的位置2个a,3的位置3个aabcabcabc 6的位置两个abcabc,9的位置三个abcabc....思路: KMP基础题目之一,直接利用的是next数组的特点,对于当前点i,i - next[i] 表示的是最小重复子串长度,如果 i - next[i] 不等于0,同时i % (i - next[i]) =原创 2014-06-01 17:05:55 · 677 阅读 · 0 评论 -
hdu2594 简单KMP
题意: 给你两个串,问你s1的前缀和s2的后缀最长公共部分是多少。思路: 根据KMP的匹配形式,我们求出s1的next,然后用s1去匹配s2,输出当匹配到s2的最后一个的时候的匹配位置就行了。原创 2014-05-22 19:36:56 · 718 阅读 · 0 评论 -
KMP中next数组的理解
next数组是KMP的核心,但对于next数组我们总是有时候感觉明白了,但有时候又感觉没明白,现在我就说下我自己对KMP中next数组的理解,首先next[i]上的数字的意义,next[i]表示的是当匹配到匹配串的第i个字母适配的时候,改跳到的位置,为什么要跳,是因为不想回到0重新浪费时间去比较,在深一点理解,我感觉next[i],里存的是 找两个相同的尽量长的字符串,一个是以从匹配串的第一个字母原创 2014-05-18 13:21:23 · 1589 阅读 · 0 评论 -
hdu 1867 求两个串的"和"最小 ,KMP
题意: 给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就是两个串可以交换位置的,cdab + abcd = abcdab 而不是 cdabcd,交换位置后合并是最短并且字典序最小的。 思路: 首先得到两个next数组,然后用st原创 2014-05-18 13:16:55 · 481 阅读 · 0 评论 -
hdu3336 KMP + DP 前缀数组出现的次数
题意: 给你一个串,问你他的所有前缀子串在本串中的出现次数,注释:abc的前缀子串是a ab abc;思路: 还是利用了next数组,先对子串求出next数组,再开一个数组dp,初始化全是1,因为每个以当前i结尾的都至少是1,然后从后往前更新,把以i结尾的加到以next[i]结尾的上,运用的next数组的特点相当于 123123123 最后一个3加到倒原创 2014-05-17 23:54:46 · 571 阅读 · 0 评论 -
hdu1711 KMP模板
题意: 给你两个串,问你第二个串是从第一个串的什么位置开始完全匹配的。。思路: 裸的KMP,也是我的第一个KMP,说下对KMP的理解吧,首先对于非优化的方法求匹配,时间复杂度应该是O(n*m) ,而KMP则是O(n + m)(感觉会比这个长点,因为子串是不回溯,但是匹配串回溯了),但不管怎样,比以往的匹配快多了,KMP的关键就是处理匹配串,也就是给那个next原创 2014-05-17 23:52:06 · 481 阅读 · 0 评论 -
hdu1686 最大匹配次数 KMP
题意: 给你两个串,问你串a在串b中出现了多少次。思路: 直接匹配,KMP时匹配到匹配串的最后一个的时候不用跳出,直接匹配就行了,最后一个'/0'不会和目标串匹配,所以经过next[l2]就直接自动找到该去的位置了,怎么说呢,今天刚学的KMP,给我的感觉就是"记忆化搜索"。原创 2014-05-17 23:49:50 · 758 阅读 · 0 评论 -
hdu1358 最小循环节,最大循环次数 KMP
题意: 给你一个字符串,让你找到一些字符串,这个字符串是从第一个字母开始的,并且他可以分成1个一上循环子结构够成的,比如 abcabcabc 那么当前的这个串就是三个abc构成的,他的AK值就是3,对于输出的答案中就会包含当前这个状态,表示为9 3。思路: 就像最小路径覆盖是二分匹配的一个景点应用一样,这种循环节的也是KMP的一个应用,结论是 当 i原创 2014-05-17 23:48:12 · 836 阅读 · 0 评论 -
hdu3746 KMP的next数组应用,求项链首尾项链循环
题意: 给你一个项链,问你最少加多少个珠子能满足整个项链是一个循环的项链(首尾相连)思路: KMP的简单应用只要了解next数组的意义就好说了,下面总结下 next在循环方面的常用应用(1)i - next[i] 最小循环节(第一个字母开始)(2)next[i] 最大循环节中的第几位数(此时循环节可交叉)(3)next[i] != 0 && i原创 2014-05-17 23:42:36 · 438 阅读 · 0 评论