【KMP算法】KMP统计子串出现次数

http://poj.org/problem?id=3461

题意:题意很明确,就是用第一行的字符串来匹配第二行给出的字符串,能在第二行的字符串中找出几个第一行这样的字符串。

思路:入门KMP算法题,打出匹配串的对应部分匹配值,然后在用kmp算法来匹配。kmp算法参考另一篇文章。

开始学kmp算法,感觉理解算法之后代码实现还是有一定套路性的,只需要每次注意一些不同题目要求来更改些细节的代码实现即可。【目前想法】


【代码实现】

#include<cstdio>
#include<cstring>
using namespace std;

const int MAXW=10001,MAXT=1000001;
char W[MAXW],T[MAXT];
int next[MAXW];
int lenW,lenT;

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

int kmp(int pos,int lenW,int lenT)
{
	int i=pos,j=0,ans=0;
	while(i<lenT) {
		if(T[i]==W[j]||j==-1) ++i,++j;
		else j=next[j];
		if(j==lenW) {
			ans++;
			j=next[j-1];
			i--;
		}
	}
	return ans;
}


int main()
{
	int n;
	scanf("%d",&n);
	while(n--) {
		scanf("%s%s",W,T);
		lenW=strlen(W);
		lenT=strlen(T);
		getnext(lenW);
		printf("%d\n",kmp(0,lenW,lenT));
	}
	return 0;
}

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/jchangbrave/article/details/52268196
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞