KMP算法 KMP模式匹配 二(串)

B -
KMP模式匹配 二(串)

Crawling in process...
Crawling failed
Time Limit:1000MS    
Memory Limit:131072KB    
64bit IO Format:
%lld & %llu

Description

输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成功,则输出0

Input

输入一个主串和一个子串

Output

匹配的趟数

Sample Input

ababcabcacbab
abcac

Sample Output

3

今早晨看了一遍才算真正看懂了代码。next数组的求值。。

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int next[10005];
char str[10005];
int len;
void getnext(char *str,int next[])
{
    int j,k;
	next[1]=0;
	j=1;
	k=0;
	while(j<=len)
		if((k==0)||(str[j]==str[k]))
		{
			++j;
			++k;
			next[j]=k;
		}
		else
			k=next[k];
}

int main()
{
	char s[1005];
	cin>>s;
	len =strlen(s);
	int j,k;
	for(j=1,k=0;k<len;j++,k++)
	{
		str[j]=s[k];
	}
	int i;
	getnext(str,next);
	for(i=1;i<len;i++)
        cout<<next[i]<<" ";
	cout<<next[len]<<endl;
	return 0;
}

KMP算法 KMP模式匹配 二(串)

时间: 2024-10-03 02:58:27

KMP算法 KMP模式匹配 二(串)的相关文章

KMP算法 KMP模式匹配 一(串)

A - KMP模式匹配 一(串) Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Description 求子串的next值,用next数组存放,全部输出 Input 输入一个字符串 Output 输出所有next值 Sample Input abaabcac Sample Output 0 1 1 2 2 3 1

KMP算法,查询匹配串的个数

想不到时隔两年回来重新学习KMP算法还是那么难,不过理解了大概,把例程贴上来,如果是求数量只需要加个count变量记录即可. #include"stdio.h" #include"string.h" void makeNext(const char P[],int next[]) { int q,k; int m=strlen(P); next[0]=0; for(q=1,k=0;q<m;q++) { while(k>0&&P[q]!=P

hihoCoder 1015 KMP算法(kmp)

#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一只河蟹,于是河蟹就向小Hi和小Ho提出了那个经典的问题:"小Hi和小Ho,你们能不能够判断一段文字(原串)里面是不是存在那么一些--特殊--的文字(模式串)?" 小Hi和小Ho仔细思考了一下,觉得只能想到很简单的做法,但是又觉得既然河蟹先生这

KMP算法(详细求串的next[n])

 怎么求串的模式值next[n]   (1)next[0]= -1  意义:任何串的第一个字符的模式值规定为-1. (2)next[j]= -1   意义:模式串T中下标为j的字符,如果与首字符 相同,且j的前面的1-k个字符与开头的1-k 个字符不等(或者相等但T[k]==T[j])(1≤k<j). 如:T="abCabCad" 则 next[6]=-1,因T[3]=T[6] (3)next[j]=k    意义:模式串T中下标为j的字符,如果j的前面k个 字符与开头的k个字符

KMP算法(具体求串的next[n])

 怎么求串的模式值next[n]   (1)next[0]= -1  意义:不论什么串的第一个字符的模式值规定为-1. (2)next[j]= -1   意义:模式串T中下标为j的字符,假设与首字符 同样,且j的前面的1-k个字符与开头的1-k 个字符不等(或者相等但T[k]==T[j])(1≤k<j). 如:T="abCabCad" 则 next[6]=-1,因T[3]=T[6] (3)next[j]=k    意义:模式串T中下标为j的字符,假设j的前面k个 字符与开头的k个

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,很自然的,需要一个函数来存储匹

串的匹配:朴素匹配&amp;amp;KMP算法

引言 字符串的模式匹配是一种经常使用的操作. 模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都非常大.而模式则比較短小.典型的样例如文本编辑和DNA分析. 在进行文本编辑时,文本一般是一段话或一篇文章,而模式则经常是一个单词.若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是非常高的. 模式匹配的朴素算法 最简单也最easy想到的是朴素匹配.何为朴素匹配,简单讲就是把模式串跟母串从左

数据结构与算法JavaScript (五) 串(经典KMP算法)

数据结构与算法JavaScript (五) 串(经典KMP算法) KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上蛋疼的KMP是讲解很多,基本都是走的高大上路线看的你也是一头雾水,我试

串的匹配:朴素匹配&amp;KMP算法

引言 字符串的模式匹配是一种常用的操作.模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都很大,而模式则比较短小.典型的例子如文本编辑和DNA分析.在进行文本编辑时,文本通常是一段话或一篇文章,而模式则常常是一个单词.若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是很高的. 模式匹配的朴素算法 最简单也最容易想到的是朴素匹配.何为朴素匹配,简单讲就是把模式串跟母串从左向右或从右向左一