题意:中文自己看。
解题思路:利用KMP就能解决问题,详见代码,如有看不懂的,请看另外一篇关于KMP的博文。
Code:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1010;
int f[maxn];
void getFail(char *P)//失配函数
{
int m = strlen(P);
f[0] = 0, f[1] = 0;
for(int i = 1; i < m; 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 find(char *P, char *T)
{
int n = strlen(T), m = strlen(P);
getFail(P);
int j = 0, num = 0;
for(int i = 0; i < n;)
{
while(j && P[j] != T[i]) j = f[j];
if(P[j] == T[i]) j++;
if(j == m) { ++num; j = 0;}//num用来统计在T中有多少个P,每次得到一个P之后,j要置0
i++;
}
return num;//返回统计的P的个数
}
int main()
{
//freopen("input.txt","r",stdin);
char P[maxn],T[maxn];
while(scanf("%s",T))
{
int len1 = strlen(T);
if(len1 == 1 && T[0] == '#') break;
scanf("%s",P);
int temp = find(P,T);
printf("%d\n",temp);
}
return 0;
}