给定一个字符串 text 和一个模式串 pattern,求 pattern 在text 中的出现次数。text 和 pattern 中的字符均为英语大写字母或小写字母。text中不同位置出现的pattern 可重叠。
输入格式:
输入共两行,分别是字符串text 和模式串pattern。
输出格式:
输出一个整数,表示 pattern 在 text 中的出现次数。
输入样例1:
zyzyzyz
zyz
输出样例1:
3
输入样例2:
AABAACAADAABAABA
AABA
输出样例2:
3
数据范围与提示:
1≤text, pattern 的长度 ≤106, text、pattern 仅包含大小写字母。
代码示例如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[1000005],p[1000005];
int Next[1000005];
void GetNext(int pLen){
int k=-1;
Next[0]=-1;
int j=0;
while(j<pLen){
if(k==-1||p[j]==p[k]){
j++;
k++;
Next[j]=k;
}else {
k=Next[k];
}
}
}
int KMP(int sLen,int pLen){
int i=0;
int j=0;
int cnt=0;
while(i<sLen&&j<pLen){
if(j==-1||s[i]==p[j]){
i++;
j++;
}else{
j=Next[j];
}
if(j==pLen)cnt++,j=Next[j-1],i--;
}
return cnt;
}
int main(){
int sLen,pLen;
for(sLen=0;(s[sLen]=getchar())!='\n';sLen++);
for(pLen=0;(p[pLen]=getchar())!='\n';pLen++);
GetNext(pLen);
cout<<KMP(sLen,pLen)<<"\n";
}