zcmu-1953: #103. 子串查找(kmp模板题)

1953: #103. 子串查找

Time Limit: 5 Sec  Memory Limit: 256 MB
Submit: 194  Solved: 81
[Submit][Status][Web Board]

Description

这是一道模板题。

给定一个字符串 A 和一个字符串 B,求 B 在 A 中的出现次数。

A 中不同位置出现的 B 可重叠。

Input

输入共两行,分别是字符串 A 和字符串 B。

Output

输出一个整数,表示 B 在 A 中的出现次数。

Sample Input

zyzyzyz

zyz

Sample Output

3

HINT

1≤A,B 的长度 ≤106 ,A 、B 仅包含大小写字母。

【分析】就模板套上就好了

#include<bits/stdc++.h>
using namespace std;
char a[1000005],b[1000005];
int p[1000005],n,m;

void pre()	//求p数组 
{
	p[1]=0;
	int j=0;
	for(int i=1;i<m;i++)
	{
		while(j>0&&b[j+1]!=b[i+1])j=p[j];
		if(b[j+1]==b[i+1])j++;
		p[i+1]=j;
	}
}
int kmp()
{
	int ans=0,j=0;
	for(int i=0;i<n;i++)
	{
		while(j>0&&b[j+1]!=a[i+1])j=p[j];
		if(b[j+1]==a[i+1])j++;
		if(j==m){
			ans++;
			//j=0;	//从头开始匹配保证不重叠,而本题是重叠,所以不用赋0
		}
	}
	return ans;
 } 
int main()
{
	while(cin>>a+1)//表示读入的字符串串首为a[1]
	{
		scanf("%s",b+1);
		m=strlen(b+1);
		n=strlen(a+1);
		pre();
		printf("%d\n",kmp());
		
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/81628122