传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1711
题意:裸的模式匹配问题,N值较大,必须使用线性算法,考虑上KMP。
关于KMP:
好久之前就看过KMP不过一直没搞懂,最近要搞下字符串,所以先拿它开刀,翻看了严蔚敏老师的数据结构,研究了许久,算是对KMP略知一二了吧,其KMP主算法还是比较好理解来的(不回溯主串匹配指针,当失配时,利用已经匹配的部分串的信息,使模式串指针向前移动,然后继续匹配),关键在于NEXT数组的求法,其实也不算很难理解(一个递推关系+自匹配的过程),书上后面说的那个修正NEXT数组的求法也比较好理解(当P[i]=P[Next[i]]时,此次滑动的没有作用的,所以直接滑到下一次去)。
关于算法的云云就没什么好说的,严蔚敏老师的书说的十分详细。(其实也是自己理解还不够深刻,不能很好的表达出来)
还有要注意一些关于coding方面的技巧。
献上一个使用了修正NEXT数组的KMP模板:
#include<iostream>
using namespace std;
const int MAXN = 1111111,MAXM = 11111;
int T[MAXN],P[MAXM],Next[MAXM];
void MakeNext(int M){
Next[0] = -1;
int i = 0, j = -1;
while(i<M){
if(j==-1||P[i]==P[j]){
i++,j++;
if(P[i]!=P[j])Next[i] = j;
else Next[i] = Next[j];
}
else j = Next[j];
}
}
int KMP(int N,int M){
int i=0,j=0;
while(i<N&&j<M){
if(T[i]==P[j]||j==-1)i++,j++;
else j = Next[j];
}
if(j==M)return i-M+1;
else return -1;
}
int main(){
int N,M,C;
scanf("%d",&C);
while(C--){
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)scanf("%d",&T[i]);
for(int i=0;i<M;i++)scanf("%d",&P[i]);
if(M>N)printf("-1\n");
else{
MakeNext(M);
printf("%d\n",KMP(N,M));
}
}
return 0;
}
分享到:
相关推荐
HDU-1711 Number Sequence(KMP算法)For each test case, you should output one line wh
next[i]的含义是在str[i]之前的字符串str[0...i]中,必须以str[i-1]结尾的后缀子串(不能包含str[0])与必须以str[0]开头的前
首先,HDU(杭州电子科技大学)是举办ACM/ICPC区域赛的高校之一,其在线判题系统HDU-ACM平台提供了大量的编程题目供参赛者练习。这些题目涵盖了算法的各个领域,如图论、动态规划、搜索算法、数学问题、字符串处理等...
杭电在线判题系统(HDU OJ)是国内外知名的编程竞赛平台,它提供了大量的编程题目供学习者练习,这些题目涵盖了从基础到高级的各类算法。 【压缩包子文件的文件名称列表】"HDU 2000-2099 解题报告.CHM" 是压缩包内...
HDU(杭州电子科技大学在线评测系统)是一个知名的编程竞赛平台,为编程爱好者提供了大量的算法题目进行练习和比赛。这个名为"HDU-2000-2099.rar_hdu"的压缩包包含了该平台从2000到2099共100道题目的源代码。这些...
kmp算法 KMP算法是一种用于在一个文本串S中查找一个模式串P出现位置的高效算法。KMP算法的核心思想是利用模式串P本身的信息来避免在文本串S中进行不必要的匹配。具体来说,KMP算法通过预处理模式串P,构建一个部分...
kmp算法 KMP算法(Knuth-Morris-Pratt算法
在"KMP-algorithm-master"项目中,可能包含了KMP算法的实现代码,这为学习和理解KMP算法提供了直观的实例。通过阅读和理解这些代码,开发者可以更好地掌握KMP算法的工作原理,并将其应用于实际问题中。此外,该项目...
KMP算法(Knuth-Morris-Pratt Algorithm)是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt提出。该算法的核心思想是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数,以达到快速匹配的目的...
C语言实现 WIN-TC专用 实现高速关键字查找功能
本项目"string-match-kmp-master.zip"显然专注于介绍和实现KMP算法。 KMP算法的主要目标是在一个大的文本串(text)中查找是否存在一个给定的小的模式串(pattern)。相比于朴素的字符串匹配方法,KMP算法通过构建...
《深入理解KMP算法》 KMP算法,全称为Knuth-Morris-Pratt算法,是字符串匹配领域中的一种高效算法,由Don Knuth、Vernon Morris和James H. Pratt三位学者在1970年代提出。这个算法主要用于在一个主串(文本串)中...
Kernelized Movement Primitives (KMP) 是一种在机器人运动规划领域广泛应用的方法,它结合了机器学习和控制理论,用于高效地生成和学习复杂的机器人运动模式。在这个“Kernelized Movement Primitives-matlab-...
KMP算法讲解之——不需要公式-就能理解KMP算法
KMP算法的板子