POJ3461-KMP演算法的簡單運用

zzc2227372發表於2014-07-06

 

求一個主串中有多少個給定的子串

直接KMP模板就OK了

#include<iostream>
using namespace std;
#define  len  1000100
char s[len];
char t[len];
int next[len];

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

			j=next[j];
		}
	}
}


int KMP()
{
	int i=0;
	int j=0;
	int  k=0;
	int slen=strlen(s);
	int tlen=strlen(t);
	getnext();
	while (i<slen)
	{
		if (j==-1||s[i]==t[j])
		{
			i++;
			j++;
			if (j==tlen)
			{
				k++;
			}
			//next[i]=j;
		}
		else
		{

			j=next[j];
		}
	}
	return k;
}
int main()
{
	int num;
	scanf("%d",&num);
	while (num--)
	{
		scanf("%s",t);
		scanf("%s",s);
		cout<<KMP()<<endl;
	}
	
	//cout<<endl;
}

 

 

 

相關文章