void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::


给出两个串,求出第一个在第二个中出现的次数

#include <stdio.h>
#include <string.h>
void preKmp(char *src, int m, int *rule){
  int i=0,j=-1;
  rule[0]=j;
  while(i<m){
	  while(j!=-1 && src[j] != src[i])
		  j=rule[j];
	  i++,j++;
	  if(j>=m)
		  rule[i]=rule[j-1];
	  else
		  rule[i]=j;
  }
}
int recount=0;
void kmp(char *src, int m, char *dest, int n)
{
	int rule[10005];
	preKmp(src,m,rule);
	int i=0, j=0;
	while(i<n){
		while(j!=-1 && src[j] != dest[i]){
			j = rule[j];
		}
		i++,j++;
		if(j==m){
 			//printf("%d\n",i-m);//匹配的位置
			recount++;
			j=rule[j];
		}
	}
}
char Reg[10005],ori[1000005];
int main()
{
	int t;
	//freopen("E:\\input.txt","r",stdin);
    scanf("%d",&t);
	while (t--)
	{
		recount=0;
        scanf("%s%s",&Reg,&ori);//找出reg在ori中出现的次数
		kmp(Reg,strlen(Reg),ori,strlen(ori));
		printf("%d\n",recount);
	}
	return 0;
}
posted on 2011-06-06 23:17  void-man  阅读(1112)  评论(1)    收藏  举报