`
从此醉
  • 浏览: 1089883 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

KMP专题【完结】

 
阅读更多


第一题 hdu 1711Number Sequence

点击打开hdu 1711

思路:

1 kmp是用来匹配字符串,只能够匹配单一的字符串
2 kmp的算法的过程:
1:假设文本串的长度为n,模式串的长度为m;
2:先例用O(m)的时间去预处理next数组,next数组的意思指的是当前的字符串匹配失败后要转到的下一个状态;
3:利用o(n)的时间去完成匹配;

3 时间复杂度为o(n+m)即o(n);

点击查看代码


第二题 hdu 1686 oulipo

点击打开hdu 1686

思路:

1 题目要求的是给定一个模式串个一个文本串,求出模式串在文本串中出现几次
2 典型的KMP问题,只要套上模板即可。

点击查看代码


第三题 hdu 2087 剪花布条

点击打开hdu 2087

思路:

1 题目要求的是给定一个文本串和给定一个模式串,求文本串中有几个模式串。
2 注意文本串为"aaaaaa",模式串"aa"的时候,ans = 3 而不是5。

点击查看代码


第四题 hdu 3746Cyclic Nacklace

点击打开hdu 3746

思路:

1 题目要求的是给定一个字符串,问我们还需要添加几个字符可以构成一个由n个循环节组成的字符串。
2 可知我们应该先求出字符串的最小循环节的长度:假设字符串的长度为len,那么最小的循环节就是cir = len-next[len] ; 如果有len%cir == 0,那么这个字符串就是已经是完美的字符串,不用添加任何字符;如果不是完美的那么需要添加的字符数就是cir - (len-(len/cir)*cir)),相当与需要在最后一个循环节上面添加几个。
3 如果cir = 1,说明字符串只有一种字符例如“aaa” ; 如果cir = m说明最小的循环节长度为m,那么至少还需m个;如果m%cir == 0,说明已经不用添加了

点击查看代码


第五题 hdu 1358 Period

点击打开hdu 1358

思路:

1 题目要求的是给定一个长度为n的字符串,求出字符串的所有前缀字符串中该字符串刚好由k个最小循环节够成,由于题目要求k最大那么就是这个循环节最小
2 只要先求出next数组,然后去枚举所有的前缀找到满足的输出长度和k

点击查看代码


第六题 hdu 2203 亲和串

点击打开hdu 2203

思路:

1 题目要求的是给定字符串s1 和 s2,问s1能否通过移位得到使得s2包含在s1里面。
2 很显然的kmp的模板题,只须在s1后面在添上一个s1即可。这里特别注意strcat的使用
3 strcat函数,函数的原行strcat(char *s , char *p);注意这里的s和p所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串;所以假设s = “abc”,现在想得到“abcabc”那么不能直接的strcat(s , s),而是先用一个tmp数组存储s,即strcpy(tmp , s , sizeof(s)) , 然后在strcat(s , tmp);

点击查看代码


第七题 hust 1010 The Minimum Length

点击打开hust 1010

思路:

1 题目要求的是,有一个字串A,现在利用A组成了一个新的字符串AAAAA...,现在从这个新的字符串的两个不同位置剪下去得到字符串B,问A的最小长度
2 由于B里面的字符都是来自A,那么如果要A最小那么最小值就是等于B的最小循环节。
3 直接对B求最小循环节

点击查看代码


第八题 poj 2406 Power Strings

点击打开poj 2406

思路:

1 题目要求的是给定一个字符串找到最小循环节的个数,但是这里有个限制的地方就是如果这个字符串不是刚好由n个最小循环节组成那么就认为一整串才是一个循环节
2 题目说了输入的字符是可打印的,所以应该用gets读入,判断终止的时候用strcmp。

点击查看代码


第九题 poj 2752Seek the Name, Seek the Fame

点击打开poj 2752

思路:

1 题意要求的找出满足既是字符串的s的前缀又是后缀的字串输出该字串的长度。
2 先看看next数组的含义:
1:next数组只和模式串本身有关和文本串是无关的,因为next表示的是当匹配失败后模式串要回溯到哪个位置。
2:next数组存储的数据是用来当模式串与主串不匹配的时候要模式串回退到第几个字符与主串再重新匹配,我们知道KMP算法的主串是不回朔的,当不匹配的时候我们不是退回到开始位置重新匹配,而是利用已经匹配的结果将模式串回朔到下一个位置,这个位置比开始位置更近一步;
简单的说就是next[ j ]的值保存的是当模式串中第 j 个字符与主串第 i 个字符不匹配时候,模式串中的哪个字符 重新与主串第 i 个再匹配,这样总的字符比较次数比从开始位置比较的次数就少了。
3:next[j]存储的就是模式串前j个字符里前缀和后缀最大的匹配长度;也就是有j = next[j] ; 假设有模式串“abcabx”,那么next[5] = 2就是前5个字符里前缀和后缀匹配最长的长度为2即“ab”;那么就是说如果next[len] = ans , 整个串的前缀和后缀最长匹配的长度就是ans,上面的字符串“abcabx”的最长匹配就是0。
4:在模式串与标准串进行匹配时,指向他们的指针分别为j、i;当p[j]!=s[i]时,j直接变为next[j],新的p[j]继续与s[i]比较,如果不相等继续进行此操作……那么数组next[j]同样反映了,在模式串p的第j个位置之前,p[0]~p[next[j]-1]与p[i-next[j]]~p[i-1]这两段是完全一样的。假设模式串为“abcdabx”,手动模拟即可知道。

点击查看代码


第十题 poj 3080 Blue Jeans

点击打开poj 3080

思路:

1 题目要求的是给定m个DNA序列,每个DNA序列长度固定为60,问m个DNA序列的最长的公共子串
2 初看题目无从下手,但是你仔细研究发现是要找m个序列的公共子串,那么这个子串必定存在于第一个DNA序列里面。这个时候就可以想到去枚举第一个DNA序列的所有子串,由于长度为60那么最多3600个子串,由于m最多10个;所以算一下复杂度就是0(3600*n*m),n是60和m最大10,那么这样的复杂度是可以接受的。

点击查看代码


第十一题 hdu 2594Simpsons’ Hidden Talents

点击打开hdu 2594

思路:

1 题目要求的是给定两个字符串s1 , s2找到s1的最长前缀等于s2的后缀
2 很明显就是next数组的应用,我们知道next[j] = len,表示的前j个字符里面前缀和后缀的最长匹配长度为len。那么我们只要合并两个字符串然后求next数组即可。
3 注意以下的数据
abcabcabcabc
abcabcabcabcabc
输出 12
abcabc
abc
输出 3
我们知道如果合并了s1和s2的话,那么求出来的最长的长度是24 和 6显然是不行的,因为我们忽略了一个地方就是求出的最长的前缀的长度是不能超过
s1和s2的长度的,所以求出最长前缀长度后应该进行讨论。

点击查看代码


第十二题 hdu 3336Count the string

点击打开hdu 3333

思路:

1 题目要求的是给定一个字符串s,求字符串s的所有的前缀在s的匹配的次数之和mod10007.
2 很明显n<= 200000,分析一下那么就要n个前缀如果每一个前最都去匹配s的话复杂度就是o(n^2),那么肯定是TLE的,所以要考虑另外的思路
3 我们知道next[j] = len,表示的是在前j个字符里前缀和后缀的最大的匹配的长度为len,所以根据next数组的性质,我们只要去枚举j的值从n->1,为什么要从n开始而不是1开始呢,这里因为是要求前缀的匹配数而不是后缀;
4 求sum的时候注意每一步都有可能超过范围,所以就要求一次sum同时取模一次。

点击查看代码


第十三题 hdu 4300Clairewd’s message

点击打开hdu 4300

思路:

1 题目要求的是给定一个不完整的由n个字符构成的字符串并且字符串有密文和明文两部分组成,现在要求完整的字符串。
2 很明显密文的长度不确定,现在又要求最短的字符串长度。由于在完整的字符串中密文和明文的长度是一样的,那么输入的字符串中至少有(n+1)/2是密文,所以我们假设密文后面的都是明文,那么我们将这些明文转化为密文后求next数组就可以知道前缀和后缀的最大的匹配数,那么如果匹配数越大就说明总的串的长度就越小。
3 但是有个地方需要注意,输入的字符串长度为n,那么至少(n+1)/2为密文,那么明文最多为tmp = n-(n+1)/2,所以next[n]的最大值是不能超过tmp的,如果超过了那么就另next[len] = tmp即可,说明已经最大了

点击查看代码


第十四题 hdu 1238 Substrings

点击打开hdu 1238

思路:

1 题目要求找到一个子串x,满足x或x的逆串是输入的n个字符串的子串,求最大的x,输出x的长度
2 题目的n最大100,每一个字符串的最大长度为100,那么暴力枚举子串就是o(n^2)才10000肯定是不会超时的,但是由于这里涉及到了逆串的问题,所以我们应该还要求出n个子串的逆串,然后在求最大的x。

点击查看代码


第十五题 hdu 2328Corporate Identity

点击打开hdu 2328

思路:

1 题意要求最长的公共子串,由于每一串的长度最长不超过200,所以可以选择暴力枚举最短的单词的子串来求出ans
2 利用kmp来匹配

点击查看代码


第十六题 hdu 3374String Problem

点击打开hdu 3374

思路:

1 题目要求给定一个字符串求出最小和最大表示的rank和出现的times。
2 如果直接暴力枚举n 最大10^6肯定TLE,所以这了应该要用到的是求解一个字符串的最小和最大表示,然后利用kmp去匹配查找出现的次数
3 在利用kmp匹配的时候应该要注意不能多算,比如有abcder,那么用abcder去匹配abcderabcder的时候就有两次的匹配结果,但实际上这里只有一个,所以这个地方要注意。

点击查看代码


第十七题 hdu 2609 How many

点击打开hdu 2609

思路:

1 题目要求的是给定n个字符串,找出不同的字符串的个数。由于题目说了,字符串可以进行变换,也就是如果两个字符串相同那么它们的最小表示是相同的。
2 只要求出所有字符串的最小表示,然后利用set存储,最后set的元素个数就是最后的ans

点击查看代码


第十八题 fzu 1901 Period II

点击打开fzu 1901

思路:

1 题目要求的找到所有满足S[i]=S[i+P] for i in [0..SIZE(S)-p-1]的前缀,并且长度为p。利用上面的式子可以等价的得到等式s[0,len-p-1] = s[p , len-1].
2 给个next数组的性质
假设现在有一个字符串为ababxxxxabab。那么求出的next数组为00012001234,那么前缀和后缀最长的匹配数是4,然后下一个前缀和后缀匹配长度为next[4] = 2 , 然后下一个为next[2] = 0。
所以有一个结论就是,假设当前求出的字符串的前缀和后缀的最长的匹配的长度为len,那么下一个满足的前缀和后缀互相匹配的长度为next[len]...依次
3 观察一下上面的等式,我们发现并不是我们所熟悉的前缀和后缀匹配的等价式。那么我们现在来看这个样列
f z u f z u f z u f 长度为10
next 000 01 2 3 456 7
那么根据next数组就得到前缀和后缀的匹配长度依次为 7 4 1 0 ,那么这时候看看题目的p的可能长度为 3 6 9 10,那么有没有发现规律。
点击查看代码


分享到:
评论

相关推荐

    拓展KMP算法(字符串题目的必备工具)

    "扩展kmp专题"这个压缩包可能包含了关于拓展KMP算法的论文和其他学习材料。这些资源通常会详细阐述拓展KMP的原理、实现方式以及应用场景,帮助读者深入理解和掌握这个算法。 总的来说,拓展KMP算法是字符串匹配技术...

    专题7-字符串1

    《专题7-字符串1》主要涉及的是字符串处理的算法,特别是KMP算法的应用。KMP算法是一种用于在主串中查找子串的高效算法,它避免了不必要的字符比较,通过预处理得到部分匹配表(next数组)来提高查找效率。 在1.1 ...

    程序设计竞赛专题挑战教程配套代码

    4. **字符串处理**:如KMP算法、Rabin-Karp滚动哈希等,这些在文本匹配和字符串操作中非常有用。 5. **数学知识**:包括组合数学、数论、概率论等,许多竞赛题目需要数学思维来解决。 6. **数据结构**:如栈、队列...

    C语言算法专题.rar

    字符串处理算法包括模式匹配(如KMP算法)、字符串排序、最长公共前后缀、最长重复子串等问题,这些在文本处理和数据分析中十分常见。 通过对这些C语言算法的深入理解和实践,你可以更好地解决各种实际问题,提升...

    数据结构大型作业专题

    此外,查找和替换功能可能需要使用字符串匹配算法,如KMP或Boyer-Moore算法,提高搜索效率。 最后,一元多项式计算通常涉及到数学和线性数据结构。我们可以用链表来存储多项式的各项,每个节点包含系数和指数。执行...

    程序设计大赛算法专题.rar

    5. **字符串处理**:KMP、Rabin-Karp和Boyer-Moore是常见的字符串匹配算法,Z-Algorithm和Manacher's Algorithm也有其独特优势。对于字符串操作,了解回文判断、最长公共前后缀、最长重复子串等问题的解决方案也很...

    大一暑假专题练习ac代码

    7. **字符串处理**:KMP算法、Z算法、Rabin-Karp模式匹配等,用于处理字符串搜索和匹配问题。 8. **数学算法**:约瑟夫环、费马小定理、欧几里得算法求最大公约数、中国剩余定理等,数学在计算机科学中扮演着重要...

    天津大学计算机考研面试(复试)算法专题(很全面)

    8. **字符串处理**:KMP算法、Rabin-Karp算法、Boyer-Moore算法等,这些都是在文本匹配和字符串搜索中常见的方法。 9. **计算几何**:直线、圆、多边形的碰撞检测,最近点对问题等,这些在图形学和游戏开发中有广泛...

    考研面试算法专题.zip

    《考研面试算法专题》是一个针对国内天津大学考研算法复习的重要资料集合。这个压缩包涵盖了数据结构与算法的多个核心主题,对于准备考研的学生来说,无疑是提升算法能力的关键资源。下面将详细阐述其中涉及的主要...

    ACM icpc 动态规划 DP专题

    这一专题主要针对ACM ICPC竞赛中的动态规划题目进行深入讲解。 动态规划的核心思想是将一个复杂的问题分解为若干个子问题,通过解决子问题来求解原问题。这种方法的关键在于找到问题的重叠子结构和最优子结构,从而...

    数据结构算法

    树状数组 经典算法题每日演练——第九题 优先队列 经典算法题每日演练——第八题 AC自动机 经典算法题每日演练——第七题 KMP算法 经典算法题每日演练——第六题 协同推荐SlopeOne 算法 经典算法题每日演练——第五...

    严老师算法设计与分析课件

    字符串处理在计算机科学中广泛应用,本专题将涉及模式匹配算法(如KMP算法)、编辑距离算法等,以及在文本处理、生物信息学等领域中的应用。 专题十:组合优化问题 最后,我们将探讨一些典型的组合优化问题,如旅行...

    天津大学考研面试算法专题(很全面)

    10. **字符串处理**:KMP算法、Boyer-Moore算法等用于字符串匹配;Manacher’s Algorithm用于找到字符串中最长的回文子串。 这些知识点不仅对于天津大学的考研面试,也是计算机专业研究生阶段必备的基础。深入理解...

    算法面试专题课(Java版),Google面试官带你高质量刷题视频教程

    "算法面试专题课(Java版),Google面试官带你高质量刷题视频教程"提供了一种高效的学习方式,旨在帮助求职者提升自己的算法水平,更好地应对包括Google在内的顶级科技公司的面试挑战。 本课程主要涵盖了以下几个方面...

    零声学院 第9代 Linux CC++后台架构开发 成长体系课程 - v1.21

    同时,还涵盖了布隆过滤器、KMP字符串匹配算法、回溯算法、贪心算法、推荐算法以及数据结构如平衡二叉树(红黑树、B-树)和栈/队列的应用。此外,课程也介绍了常用的设计模式,如单例模式、责任链模式、过滤器模式、...

    算法面试专题课(Java版),Google面试官带你高质量刷题

    - **字符串匹配问题**:通过KMP算法、Boyer-Moore算法等高效地解决字符串匹配问题。 - **图论问题**:利用Dijkstra算法求最短路径,使用Floyd算法求所有顶点对间的最短路径。 - **区间查询问题**:介绍线段树、树状...

    acm从入门到放弃

    - 扩展KMP算法:KMP算法的扩展,用于处理多个模式串的匹配问题。 - AC自动机:一种多模式串匹配的数据结构。 - Tire树:即字典树,用于快速检索字符串。 - Manacher算法:用于寻找字符串中所有回文子串的算法。 - ...

    NOIP2019提高组突破营课件.rar

    3. **动态规划**:这是算法竞赛中的一个重要专题,课件可能详细讲解动态规划的原理、状态转移方程的设计和优化技巧,如记忆化搜索、滚动数组、剪枝等。 4. **贪心算法**:在部分问题中,通过局部最优决策可以达到...

    【高优指导】2021高三历史人民版一轮专题质检卷十三 西方人文精神的起源与发展 .docx

    - **字符串匹配算法**:如KMP算法,用于在文档中快速查找特定的关键词或短语。 ### 3. 自然语言处理技术 #### 技术背景: 自然语言处理技术在理解和分析历史文档方面发挥着重要作用,包括文本分类、情感分析等。 ...

    挑战程序设计竞赛(第2版)PDF

    4. **字符串匹配算法**:包括KMP算法、Boyer-Moore算法等,这些算法能够高效地处理大规模文本数据中的模式匹配问题。 ### 四、数据结构优化 1. **线性表**:如链表、队列、栈等,这些是最基本的数据结构,也是构建...

Global site tag (gtag.js) - Google Analytics