hihoCoder#1015 : KMP算法 (KMP模板)

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<vector>
# include<queue>
# include<list>
# include<set>
# include<map>
# include<string>
# include<cmath>
# include<cstdlib>
# include<algorithm>
using namespace std;
# define LL long long

const int N=1005;
const int INF=1000000000;
const LL oo=0x7fffffffffffffff;
const double eps=1e-10;

int f[N*10];

void getNext(string p)
{
	int n=p.length();
	f[0]=f[1]=0;
	for(int i=1;i<n;++i){
		int j=f[i];
		while(j&&p[i]!=p[j]) j=f[j];
		f[i+1]=(p[i]==p[j])?j+1:0;
	}
}

int solve(string p,string q)
{
	getNext(q);
	int n=p.length();
	int m=q.length();
	int ans=0;
	int j=0;
	for(int i=0;i<n;++i){
		while(j&&p[i]!=q[j]) j=f[j];
		if(p[i]==q[j]) ++j;
		if(j==m) ++ans;
	}
	return ans;
}

int main()
{
	int T;
	string p,q;
	scanf("%d",&T);
	while(T--)
	{
		cin>>p>>q;
		printf("%d
",solve(q,p));
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/20143605--pcx/p/5443539.html