`
Coco_young
  • 浏览: 127625 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

[KMP模板题]HDU-1711 Number Sequence

 
阅读更多

传送门: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;
}


分享到:
评论

相关推荐

    zyq2652192993zyq#Advance-Algorithm#HDU-1711 Number Sequence(KMP算

    HDU-1711 Number Sequence(KMP算法)For each test case, you should output one line wh

    samcat2021#ZXBlog#Hdu - 1711. Number Sequence以及KMP算法总结1

    next[i]的含义是在str[i]之前的字符串str[0...i]中,必须以str[i-1]结尾的后缀子串(不能包含str[0])与必须以str[0]开头的前

    hdu-acm源代码(上百道源代码)

    首先,HDU(杭州电子科技大学)是举办ACM/ICPC区域赛的高校之一,其在线判题系统HDU-ACM平台提供了大量的编程题目供参赛者练习。这些题目涵盖了算法的各个领域,如图论、动态规划、搜索算法、数学问题、字符串处理等...

    HDU-2000-2099.zip_hdu2000

    杭电在线判题系统(HDU OJ)是国内外知名的编程竞赛平台,它提供了大量的编程题目供学习者练习,这些题目涵盖了从基础到高级的各类算法。 【压缩包子文件的文件名称列表】"HDU 2000-2099 解题报告.CHM" 是压缩包内...

    HDU-2000-2099.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个知名的编程竞赛平台,为编程爱好者提供了大量的算法题目进行练习和比赛。这个名为"HDU-2000-2099.rar_hdu"的压缩包包含了该平台从2000到2099共100道题目的源代码。这些...

    HDOJ 1711 Number Sequence(KMP算法)可AC(C++版本)

    kmp算法 KMP算法是一种用于在一个文本串S中查找一个模式串P出现位置的高效算法。KMP算法的核心思想是利用模式串P本身的信息来避免在文本串S中进行不必要的匹配。具体来说,KMP算法通过预处理模式串P,构建一个部分...

    KMP算法(Knuth-Morris-Pratt算法

    kmp算法 KMP算法(Knuth-Morris-Pratt算法

    kmp算法,kmp-algorithm-master (1).zip

    在"KMP-algorithm-master"项目中,可能包含了KMP算法的实现代码,这为学习和理解KMP算法提供了直观的实例。通过阅读和理解这些代码,开发者可以更好地掌握KMP算法的工作原理,并将其应用于实际问题中。此外,该项目...

    KMP算法(Knuth-Morris-Pratt算法)

    KMP算法(Knuth-Morris-Pratt Algorithm)是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt提出。该算法的核心思想是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数,以达到快速匹配的目的...

    KMP-----c语言代码实现,能够实现查找功能

    C语言实现 WIN-TC专用 实现高速关键字查找功能

    模式匹配,KMP算法,string-match-kmp-master.zip

    本项目"string-match-kmp-master.zip"显然专注于介绍和实现KMP算法。 KMP算法的主要目标是在一个大的文本串(text)中查找是否存在一个给定的小的模式串(pattern)。相比于朴素的字符串匹配方法,KMP算法通过构建...

    kmp算法kmp-algorithm-master.zip

    《深入理解KMP算法》 KMP算法,全称为Knuth-Morris-Pratt算法,是字符串匹配领域中的一种高效算法,由Don Knuth、Vernon Morris和James H. Pratt三位学者在1970年代提出。这个算法主要用于在一个主串(文本串)中...

    Kernelized Movement Primitives (KMP)-matlab-master.zip

    Kernelized Movement Primitives (KMP) 是一种在机器人运动规划领域广泛应用的方法,它结合了机器学习和控制理论,用于高效地生成和学习复杂的机器人运动模式。在这个“Kernelized Movement Primitives-matlab-...

    KMP算法讲解之-不需要公式-就能理解KMP算法

    KMP算法讲解之——不需要公式-就能理解KMP算法

    KMP算法模板-c++

    KMP算法的板子

Global site tag (gtag.js) - Google Analytics