神奇彩带KMP】的更多相关文章

描述 有两条彩带A,B,如果能制作出一条彩带,这条彩带既是彩带A的前缀,又是彩带B的后缀,称之为神奇彩带 草滩小王子想送一条最长的神奇彩带给拉面女神 给你两条彩带,你能找到最大的神奇彩带的长度是多少吗? ( 如果你不知道什么是前缀和后缀,我只能呵呵一下,然后向你解释: 对于串abcd 它有前缀a ab abc abcd 它有后缀 d cd bcd abcd 你懂了吧) 例子: 彩带A: ssyybbb 彩带B: kkkssyy 可以找到彩带C:ssyy 既是 A的前缀,又是B的后缀  所以C是神…
题意: 定义a为一个字符串,a*a表示两个字符相连,即 an+1=a*an ,也就是出现循环了.给定一个字符串,若将其表示成an,问n最大为多少? 思路: 如果完全不循环,顶多就是类似于abc1这样,即n=1.但是如果循环出现了,比如abab,那就可以表示成(ab)2.还有一点,就是要使得n尽量大,那么当出现abababab时,应该要这么表示(ab)4,而不是(abab)2. 此题用神奇的KMP解决,也就是主要利用next数组.举例说明. 一般出现循环的都会大概是这样的:abcabcabc.而这…
给你两个字符串a(len[a]=n),b(len[b]=m),问b是否是a的子串,并且统计b在a中的出现次数,如果我们枚举a从什么位置与匹配,并且验证是否匹配,那么时间复杂度O(nm), 而n和m的范围为10^5,这样做显然超时,因此我们就要用到神奇的KMP算法,在O(n)的时间内解决这一类的问题. 首先给出两个字符串 A:abababaababacb B:ababacb 首先我们思考朴素算法,我们枚举A串的每一位作为开始与B串匹配的位置,然后一位一位进行检验,如果匹配失败则会从B串的开始重新匹…
A. 草滩的魔法学校 分析: 高精度乘法 或 JAVA大数类 很明显 10000 的阶乘已经远远超过 64 位数能表示的范围了.所以我们要用一个比较大的数组来存放这个数.那数组要开多少位合适呢?我们不妨计算一下 10000 个 10000 相乘有多少位,是一个 40000 位数.所以 40000 大小的数组肯定够了.接下来就是模拟一下乘法运算.因为数位太大不能直接相乘,所以我们就逐位相乘.相乘得到的数的个位是结果的对应位置的数字,然后除以 10 把进位保留下来,加到下一次乘法中. 在输出的时候注…
引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T(长度分别为 n 和 m),下标从 0 开始,定义 extend[i] 等于 S[i]...S[n-1] 与 T 的最长相同前缀的长度,求出所有的 extend[i].举个例子,看下表: i 0 1 2 3 4 5 6 7 S a a a a a b b b T a a a a a c extend[…
String Problem Description Give you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can generate seven strings: String Rank SKYLONG 1 KYLONGS 2 YLONGSK 3 LONGSKY 4 ONGSKYL 5 NGSKYLO…
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5782 [题目大意] 给出两个字符串,判断他们每一个前缀是否循环同构,循环同构的意思就是,字符串首位相接拼成一个环,两个环通过旋转可以相等. [题解] 这道题用到了一个神奇的结论,如果S字符串和T字符串循环同构,那么必有S=u+v,T=v+u,而且u和v必有一个是最长匹配. 那么根据这个结论,我们可以用KMP算法在T中找S的最长前缀,也就是每次匹配到i时候的j.那么对于T的前缀和S的后缀,我们直接…
文档下载页面http://download.csdn.net/detail/yedeqixian/4209500      80页在讲KMP算法的开始先举了个例子,让我们对KMP的基本思想有了最初的认识.目的在于指出“由此,在整个匹配的过程中,i指针没有回溯,”.我们继续往下看:现在讨论一般情况.假设 主串:s: ‘s(1)  s(2)  s(3) ……s(n)’ ;   模式串 :p: ‘p(1)  p(2)  p(3)…..p(m)’ 把课本上的这一段看完后,继续现在我们假设 主串第i个字符…
扩展kmp                 LRH 所谓扩展kmp指的是与kmp相似的求辅助数组的原理,但是本身与kmp关系不大. 1.exkmp的用途:给定一个主串s和一个子串t,求出s中每一个后缀和子串t的最长公共前缀. 2.算法推导: 给定一个主串:S=aaaaaaaaaabaaa  T=aaaaaaaaaaa (下标都是从零开始!!!)                  第一步 需要有两个辅助数组:extand[i]和next[i]: extand[i]:表示主串S以i开始的后缀与子串T…
扩展kmp                 LRH 所谓扩展kmp指的是与kmp相似的求辅助数组的原理,但是本身与kmp关系不大. 1.exkmp的用途:给定一个主串s和一个子串t,求出s中每一个后缀和子串t的最长公共前缀. 2.算法推导: 给定一个主串:S=aaaaaaaaaabaaa  T=aaaaaaaaaaa (下标都是从零开始!!!)                  第一步 需要有两个辅助数组:extand[i]和next[i]: extand[i]:表示主串S以i开始的后缀与子串T…
个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也不会....) 我的tire树,kmp算法的next,AC自动机的fail全是用数组实现的!!!!(还有谁???!!!) 所以 上板子 1.KMP 2.TRIE 3.AC自动机 void make() { nxt[1]=0; for(int i=2; i<=len1; i++) { int j=nx…
这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串string a;这就需要根据具体场景来选择合适方便操作的方法.还有空串和空格串是不同的,空串字符长度为0(符号‘∅’),空格串包含一个或多个空格.这一章学习了两个串的模式匹配算法,特别是KMP算法,从中受益匪浅. 一.串 1.BF(Brute-Force)算法 这个模式匹配算法简单直观,被人们称为暴…
这篇小结主要是参考这篇帖子从头到尾彻底理解KMP,不得不佩服原作者,写的真是太详尽了,让博主产生了一种读学术论文的错觉.后来发现原作者是写书的,不由得更加敬佩了.博主不才,尝试着简化一些原帖子的内容,希望能更通俗易懂一些.博主的帖子一贯秉持通俗易懂的风格,使得非CS专业的人士也能读懂,至少博主自己是这么认为的-.-||| KMP算法,全称Knuth-Morris-Pratt算法,根据三个作者Donald Knuth.Vaughan Pratt.James H. Morris的姓氏的首字母拼接而成…
KMP算法是一种优秀的字符串匹配算法,字符串匹配的常规算法是一步一步进行移位和比较操作,直至找到完全相匹配的字符串. 下面通过一个例子,为大家仔细说明KMP算法的使用和思路: 问题: 在字符串“DEABCDABABCDABCDABDE”字符串中,匹配字符串"ABCDABD". 算法思路: KMP算法的思路在于,根据已经匹配的部分字符的信息,不把搜索位置移回已经比较过的位置,这样就提高了效率,是不是还是有点不清楚?没关系,让我们来根据一个例子来切实体会一下KMP算法是如何实现的. 图解:…
基于KMP算法的字符匹配问题 反正整个清明都在纠结这玩意...差点我以为下个清明要给自己过了. 至于大体的理解,我就不再多说了(还要画图多麻烦鸭),我参考了以下两个博客,写的真的不错,我放了超链接,点击就可以传送过去了. (原创)详解KMP算法(点击跳转):图画的很棒,很好理解,一步步带你深入 KMP算法最浅显理解--一看就明白(点击跳转):对主要的疑问有很细致地回答 需要注意的是,两篇博客都是以字符数组下标为0处开始存储 我对next数组不是很理解,说是next[j]表示的是j下一个指向的模式…
引言 KMP算法指的是字符串模式匹配算法,问题是:在主串T中找到第一次出现完整子串P时的起始位置.该算法是三位大牛:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,以其名字首字母命名.在网上看了不少对KMP算法的解析,大多写的不甚明了.直到我看到一篇博客的介绍,看完基本了解脉络,本文主要是在其基础上,在自己较难理解的地方进行补充修改而成.该博客地址为:https://www.cnblogs.com/yjiyjige/p/3263858.html,对作者的明晰的解析表示感谢…
字符串很神奇,因为它在计算机中应用很广泛,就每一个程序都需要用到字符串,所以学好字符串是非常重要的. 接下来就介绍两个字符串的基本操作 1:字符串hash  一种可以查找几个字符串有几个不同的字符串. 其精髓就是把一堆字符串都转换成几个数字的和的形式. 要领就是把字符串每一位字母的阿斯克码不会拼啊都乘上一个比较神奇的数,再%上一个神奇的数,比如你的生日啊,qq号什么的,尽量是质数,太大了也不行,会爆炸的. van成之后,再把这个值都存进一个数组中,最后查的时候直接用就是了. 为什么这样就可以实现…
题意 一开始给你一个长为 \(S\) 的字符串. 从空串开始,不断在后面添加一个 \([A, A + n]\) 的一个字符. 第一次包含 \(S\) 的时候会停止添加.问期望的添加次数. 有 \(T\) 组数据. \(T \le 10, |S| \le 12, n \le 26\) 题解 单模板匹配的直接用 \(\mathrm{KMP}\) 就可以了. 那么我们枚举 \(S\) 第 \(i\) 位 \(S_i\) ,然后枚举当前这位填的数 \(c\) ,那么就会转移到 \(S_{\delta (…
0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多项式复杂程度的非确定性问题, 首先是基本的0-1背包问题. ''' '''给定N个物品和一个背包,物品i的质量是Wi,其价值位Vi,背包的容量为C,问应该 如何选择装入背包的物品,使得转入背包的物品的总价值为最大? 在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包.不能将 物品i装…
题目传送门 Power Strings 格式难调,题面就不放了. 一句话题意,求给定的若干字符串的最短循环节循环次数. 输入样例#1: abcd aaaa ababab . 输出样例#1: 1 4 3 就这样. 分析: 一道思路神奇的题目,需要深入理解$KMP$的$next$数组. 如果自己写几个字符串推一下就可以发现,一个由循环节构成的字符串,从第二个循环节开始$next$值是依次递增的,因为$next$数组的本质是表示$0\~i-1$的最长公共前缀后缀长度.也就不难想到,只要判断一下$nex…
KMP 简要说明 \(kmp\)是一个非常神奇的东西.它的\(fail(next)\)数组\(f[i]\)就表示\(1\)~\(i\)这个串的最长公共前缀后缀长度.根据这个\(fail\)数组,在匹配的时候就可以加快当前匹配位置的转移,省去一些不必要的比较. 题目 剪花布条 题意:给两个字符串\(s\),\(t\),问将\(s\)按照适当的方式切割后,最多能得到几个串\(t\)? 这里考虑不使用\(hash\)的做法. 在字符串\(s\)中找\(t\),用\(kmp\)即可.需要注意的是前后两次…
题意: 求子串w在T中出现的次数. kmp算法详解:http://www.cnblogs.com/XDJjy/p/3871045.html #include <iostream> #include <cstring> #include <string> #include <cstdio> using namespace std; int lenp; int lens; void getnext(int *next, char *p) { , k = -; n…
看了Angel_Kitty学姐的博客,我豁然开朗,写下此文: 那么首先我们知道,kmp算法是一种字符串匹配算法,那么我们来看一个例子. 比方说,现在我有两段像这样子的字符串: 分别是T和P,很明显,P比T的长度要短很多,我们要做的事情呢,就是找找T中有没有和P相同的一段. 如果按照最简单的办法来做匹配的话,我们一般是一个一个字母的来做. 像这样: 很显然,图中前面3位都是能匹配的,而第四位却不能匹配,怎么办? 这样: 我们就会将整个P字符串向右移动一格,又重新开始,从T中b处与P中第一个a处开始…
今天,看了KMP,首先是在网上看的,看了很久没看懂,有很多思想,很多next的推导,就相当于很多的版本,后来,去看了<<大话数据结构>>这本书,才看懂,这KMP的神奇之处,这本书写得很详细,非常好理解,对于KMP的思想,对于next的推导,next的优化,都说得比较好理解.看懂后,才惊觉,网上的很多人竟然是不懂KMP就敢写,很容易误导人,比如有的对于next的推导过程,根本就不是O(m),应该算是O(m*m)的,唉...看完next的推导,优化,不觉惊叹这牛逼的算法啊.其实我想说,…
学密码学一定得学程序 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 曾经,ZYJ同学非常喜欢密码 学.有一天,他发现了一个很长很长的字符串S1.他很好奇那代表着什么,于是神奇的WL给了他另一个字符串S2.但是很不幸的是,WL忘记跟他说是什么意 思了.这个时候,ZYJ不得不求助与伟大的ZP.ZP笑了笑说,这个很神奇的,WL的意思是只要你找到她给你的字符串在那个神奇的字符串的位置,你就会有 神奇的发现.ZYJ恍然大悟,原来如此,…
>>点击进入原题测试<< 思路:用KMP优化的暴力写了一遍,超时!没有充分利用KMP中next数组的性质. 首先这个题是肯定要用到KMP算法的,然后会有一个next[]数组. 用一个数组来sum[i]表示长度为i的前缀的字符串有多少个,于是默认所有初始值为1: 然后倒着递推sum[next[i]]+=sum[i];原理的话自己找个样例手动模拟一下应该就清楚了,真的是很神奇的一个规律. 注意使用长整形,有个样例会溢出! 参照一下帖子 https://blog.csdn.net/lar…
题目描述 撸呀撸很迷茫,因为他的左手总是不受控制,做一些不雅的事情.于是撸呀撸一狠心,决定戒撸.没想到,他的左手受不了寂寞,一闲下来就在键盘上各种乱敲. 唔,神奇的左手表示,safasfasaafafsfafasffsfsfsffsfddfafdfsfadffafadfafadfadfafadfsfa…… 他发现敲出来的字符串有一定规律:如果将字符串划分成若干部分,那么每部分都可由其子串重复若干次得到.“若干次”往往大于1,但也可以为1.小撸想请你算一算:用最优的方法划分字符串,然后将各部分替换…
输入: ABCDABTBD_TISABCDABCABCDABC q为当前nxt处理的模版文本串下标: k为“失配时去哪里”,详情请看注释. --------------我是求完nxt的分界线------------------ q为当前文本串判断到哪里: nxt为“失配时去哪里”. 输出:nxt[q(1)]=k(0);nxt[q(2)]=k(0);nxt[q(3)]=k(0);k(0)++;nxt[q(4)]=k(1);k(1)++;nxt[q(5)]=k(2);k(2)++;nxt[q(6)]…
题目大意:给你一个神奇的印章,他左右下三个面都是直的,上面是凸凹不平的面(凸凹都平行于别的面).然后给你一个轮廓线,如果一个面能与轮廓线完全重合,可以把印章的这个沿着轮廓线拓印,求所有的拓印方案. 把轮廓线和印章相邻两个高度打个查分,然后KMP匹配一下就行了. #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #define N 10010 #define…
一般字符串比较长串m短串为n,那么用暴力方法复杂度为O(m*n) 但是kmp却可以达到O(m+n)!!!!!! 对于这个神奇的算法,我也是似懂非懂, 下面介绍一个简单的方法求kmp 1.求next数组 这个数组时kmp的灵魂!next数组时对于短串n求的 步骤: 1)next[0]=-1 2)  next[i]=前面的字符串中最大公共子串长度 例子: 设m串为:a b a b c, 串长为5,那么next数组长度为5,下面是对应的next数组    可以看到,b下面有一个1,这个1是怎么得来的呢…