2019/4/22 kmp模板

Posted yuanweidao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019/4/22 kmp模板相关的知识,希望对你有一定的参考价值。

题目连接:传送门!!!

这里是从头到尾彻底理解KMP的一篇博客,写的非常好 :https://blog.csdn.net/v_JULY_v/article/details/7041827

题意:输入多组样例,每组给定一个模板串S,文本串T,问S在T中出现的次数

这道题主要是为了记录一下kmp的模板, 我太菜了,不能彻底理解 ,先记着吧

 

void getnext() //获得next数组 
{
	next[0] = -1; 
	int j = 0, k = -1; 
	while(j < len1)
	{
		if(k == -1 || s1[j] == s1[k])
		{
			j ++, k ++;
			next[j] = k;
		}
		else
			k = next[k];
	}
}

  

void kmp()//输出出现次数 
{
	ans = 0;
	int j = 0, k = 0;
	while(k < len2)//遍历文本串 
	{
		if(j == -1 || s1[j] == s2[k])
		{
			j ++, k ++;
		}
		else
			j = next[j];//模式串移动距离相当于 next[j] 
		if(j == len1)//如果匹配到一次完整的模式串 ,出现次数++ 
		{
			ans ++;
			j = next[j]; //回到模式串开头位置,重新找在文本串中找 
		}
	}
	printf("%d
", ans);
}

  

void kmp()//输出模式串在文本串中的各个位置 ,没找到输出-1 
{
	int flag = 0;
	int j = 0, k = 0;
	while(k < len2) //遍历文本串
	{
		if(j == -1 || s1[j] == s2[k])
		{
			j ++, k ++;
		}
		else
			j = next[j]; //回到上一个j位置字符的位置 
		if(j == len1)
		{
			if(!flag)
				printf("%d", k - j);
			else
				printf(" %d", k - j);
			flag = 1;
			j = next[j]; //回到模式串开头位置,重新找在文本串中找 
		}
	}
	if(!flag)
		printf("-1
");
	else
		printf("
");
}

  

以上是关于2019/4/22 kmp模板的主要内容,如果未能解决你的问题,请参考以下文章

KMP kmp模板

扩展KMP模板

KMP算法模板

KMP模板

模板——kmp

KMP入门 博客推荐+模板+入门习题