首页 > 其他分享 >KMP

KMP

时间:2022-11-20 19:11:18浏览次数:39  
标签:nxt 匹配 int 模式 KMP 失配

KMP算法

模式串p:就是需要寻找的那个串
文本串t:就是一个待与模式串p匹配的字符串
作用:
1.求出模式串p在文本串中出现的位置
2.求出模式串长度为i的前缀的最长的border(就是nxt[]数组,获取失配指针的数组)

算法思想:
充分利用模式串p,使得之前被匹配过的地方不再多匹配
与文本串匹配时,失配之后,利用某一部分前缀快速移动
nxt[i]数组记录匹配到模式串的第i位之后失配,该跳转到模式串的哪个位置,
那么对于模式串的第一位和第二位而言,只能回跳到1

//luoguP3375 KMP字符串匹配
#include <bits/stdc++.h>
using namespace std;

const int N=1e6+10;

int nxt[N];
void getfail(char *p) {
	
	int m=strlen(p+1),j=0;
	nxt[0]=0;
	nxt[1]=0;
	for(int i=2;i<=m;i++) {
		
		while(j&&p[i]!=p[j+1]) j=nxt[j];
		if(p[i]==p[j+1]) j++;
		nxt[i]=j;
		
	}
	
}

void kmp(char *t,char *p) {
	
	int n=strlen(t+1);
	int m=strlen(p+1);
	getfail(p);
	int j=0;
	for(int i=1;i<=n;i++) {
		
		while(j&&t[i]!=p[j+1]) j=nxt[j];
		if(t[i]==p[j+1]) j++;
		if(j==m) {
			
			printf("%d\n",i+1-m);
			j=nxt[j];
			
		}
		
	}
	
}

char p[N],t[N];

int main() {
	
	cin>>(t+1)>>(p+1);
	kmp(t,p);
	int m=strlen(p+1);
	for(int i=1;i<=m;i++) {
		
		printf("%d ",nxt[i]);
		
	}
	
	return 0;
}

标签:nxt,匹配,int,模式,KMP,失配
From: https://www.cnblogs.com/Diamondan/p/16909230.html

相关文章

  • 数据结构篇——KMP算法
    数据结构篇——KMP算法本次我们介绍数据结构中的KMP算法,我们会从下面几个角度来介绍:问题介绍暴力求解知识补充Next示例Next代码匹配示例匹配代码完整代码问题......
  • kmp算法(Java)
    详解参考:KMP算法讲解next数组求法方式1移动位数=已匹配的字符数-对应的部分匹配值已知空格与D不匹配时,前面六个字符"ABCDAB"是匹配的。查表可知,最后一个匹......
  • KMP算法
    KMP算法​​1.什么是KMP算法​​​​2.KMP算法能解决哪些问题​​​​3.KMP算法是如何运行的​​​​4.KMP算法是如何进行跳的​​​​5.如何求取前缀表​​​​6.KMP算法的......
  • [模板]kmp求Next数组
    模板#include<iostream>#include<string>usingnamespacestd;voidgetNext(conststring&p,intnext[]){intlen=(int)p.size();next[0]=-1;......
  • 图解 KMP 算法
    图解KMP算法KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!快速模式匹配算法,简称KMP算法,是在BF算......
  • KMP
    前缀函数nxt[i]表示s[0...i]最长相等的真前缀与真后缀的长度。i-nxt[i]即为s[0...i]的一个周期。前缀函数求法,j代表的时长度。下标从0开始。for(inti=1,j=0;i<n;i......
  • KMP
    Java代码importjava.io.*;/***@authorjeffery.ma*@date2022/10/2413:56*/publicclassMain{publicstaticvoidmain(String[]args)throwsIOE......
  • AC 自动机——trie 树与 KMP 算法的结合体
    默认所有字符串的下表从\(1\)开始。梗概与实现如果是单一的模式串和字符串进行匹配,KMP算法自然可以派上用场。但如果有多个模式串呢?对每个模式串都跑一遍KMP?如果有......
  • KMP——字符串匹配的利器
    默认所有字符串的下标从\(1\)开始。\(\text{KMP(Knuth-Morris-Pratt)}\)算法,能够在\(O(|s|+|p|)\)的时间复杂度内求出模式串\(p\)在文本串\(s\)中的出现次数、......
  • KMP算法
    KMP算法是一个字符串匹配算法,或者说是一个子字符串匹配算法算法在字符串str中搜索子串pattern,如果存在,返回这个子串的起始索引,如果不存在,返回-1暴力枚举匹配暴力的字符......