hdu 1686(标准的kmp,可当模板)

/*
	题意:给两个字符串a,s,判断a在s里出现的个数

*/

#include <stdio.h>
#include <string.h>

int next[10005];
char a[10005];
char s[1000005];
int n,len_a,len_s;

void Get_Next()
{

	a[0] = '#';//因为是a+1,如果a[0]不存在,那strlen(a) = 0 ;       !!!!!!!!!!!
	len_a = strlen(a);
	len_s = strlen(s);
	next[1] = 0;
	int j = 0;
	for(int i=2;i<=len_a;i++)
	{
		while(j > 0 && a[j+1] != a[i])//  j+1要理解,j因为要连续向前找next[j],而不是j+1
			j = next[j];
		if(a[j+1] == a[i])
			j++;
		next[i] = j;
	}
}

int Str_Match()
{//跟Get_Next类似,理解后可手写!
	int j = 0;
	int num = 0;
	for(int i=0;i<len_s;i++)
	{
		while(j>0 && a[j+1]!=s[i])
			j = next[j];
		if(a[j+1] == s[i])
			j++;
		if(j == len_a - 1){
			j=next[j];
			num++;
		}
	}
	return num;
}

int main()
{
	scanf("%d",&n);
	while(n--)
	{
		getchar();
		scanf("%s %s",a+1,s);//!!!!这用的是a+1,为的是字符串位置跟实际位置相对应,函数好写一点
		Get_Next();
		printf("%d\n",Str_Match());
	}
	return 0;
}
posted @ 2011-02-19 18:58  kfinder  阅读(524)  评论(0编辑  收藏  举报