POJ3461

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define N 1000005

int next[N],len1,len2,ans;

char s1[N],s2[N];



void getnext(){

	int k,j;

	len1=strlen(s1);

	next[0]=-1;

	j=0;

	k=-1;

	while(j<len1){

		if(k==-1||s1[k]==s1[j]){

			k++;

			j++;

			next[j]=k;

		}

		else

			k=next[k];

	}

	return ;

}



int kmp(){

	int j,k,cnt;

	len2=strlen(s2);

	j=k=0;

	cnt=1;

	getnext();

	while(j<len2&&k<len1){

		if(k==-1||s2[j]==s1[k]){

			j++;

			k++;

		}

		else

			k=next[k];

		if(k==len1){

			ans++;

			k=next[k];

	}

	}

	return ans;

}



int main(){

	int i,j,k;

	scanf("%d",&k);

	while(k--){

		ans=0;

		scanf("%s%s",s1,s2);

		kmp();

		printf("%d\n",ans);

	}

	return 0;

}

  简单的KMP

就是查看第一个字符串在第二个字符串中出现的次数。

你可能感兴趣的:(poj)