poj 3461

题意:给你一个子串(模式串)和一个母串(文本),问子串在母串中出现的次数。

代码:

#include<iostream>
#include<fstream>

using namespace std;

char s[10012];
char t[1000012];
int next[10011];

void getnext(){
	int i,j,k;
	j=0;k=-1;next[0]=-1;
	int len=strlen(s);
	while(j<len)
		if(k==-1||s[k]==s[j])
			next[++j]=++k;
		else
			k=next[k];
}

void kmp(){
	int i,j,k=0;
	getnext();
	i=0;j=0;
	int len=strlen(t);
	int len1=strlen(s);
	while(i<len)
	{
		if(j==-1||t[i]==s[j])
		{
			i++;j++;
			if(j==len1)
			{
				k++;
				j=next[j];
			}
		}
		else
			j=next[j];
	}
	cout<<k<<endl;
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	int cas;
	cin>>cas;
	while(cas--)
	{
		cin>>s>>t;
//		getchar();
//		scanf("%s%s",s,t);
		kmp();
	
	}

}

int main(){
	read();
	return 0;
}

posted on 2011-05-19 16:23  宇宙吾心  阅读(419)  评论(0)    收藏  举报

导航