题目大意:
给定两个字符串s1,s2,求从s1中能截取多少个完整的s2;
多组输入,用“#”表示结束。
解题思路:
KMP: https://blog.youkuaiyun.com/sodacoco/article/details/83240824;
ps:注意无重叠;
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char A[1007],B[1007];
int P[1007],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; //从头匹配,保证不重叠
}
}
return ans;
}
int main(){
while(cin>>A+1){//cin>>A+1表示读入的字符串串首为A[1]
if(A[1]=='#') break;
scanf("%s",B+1);
m=strlen(B+1);
n=strlen(A+1);
pre();
printf("%d\n",kmp());
}
return 0;
}