hdu 2078 水题 kmp 计算str1中有几个str2

kmp是从最初的字符串匹配算法优化而来的,其中就是多了一个函数值函数,记录最后

的匹配的,从而得到优化,有回溯的感觉。只是对kmp的函数值函数求法有的不理解

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;

int n[1000];
char str1[1000];
char str2[1000];
int sum;

void kmp(char *p,int next[])
{
	int i;

	int j=0;
	int k=-1;
	next[0]=-1;

	while(p[j]!='\0')
	{		
		if(k==-1||p[j]==p[k])
		{
			j++;
			k++;

			if(p[j]!=p[k])
				next[j]=k;
			else
				next[j]=next[k];

		}else
		{
			k=next[k];
		}
	}

	//for(i=0;i<j;i++)
		//printf("%d ",next[i]);
	//printf("\n");
}

void makekmp()
{
	int i,j;

	int len1=strlen(str1);
	int len2=strlen(str2);

	//printf("%d%d\n",len1,len2);

	for(i=0,j=0;i<len1;i++)
	{
		while(str1[i]==str2[j])
		{
			if(j==len2)
				break;
			i++;
			j++;
		}
		if(j==len2)
		{
			j=0;
			i--;
			sum++;
		}else
		{
			if(n[j]!=-1)
				j=n[j];
			else
				j=0;
		}
	
		//printf("fz1:%d %d %d %d\n",len1,len2,i,j);
	}
	printf("%d\n",sum);
}

int main()
{
	while(cin>>str1[0],str1[0]!='#')
	{
		//printf("%c\n",str1[0]);

		scanf("%s%s",&str1[1],&str2);

		kmp(str2,n);

		sum=0;

		makekmp();
	}

	return 0;
}

  

原文地址:https://www.cnblogs.com/jackes/p/2432229.html