看样例就知道题意,kmp模板的稍微改动
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0
3
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
char t[1111],p[1111];
int pi[1111];
void getFail(char* P, int* f)
{
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* T, char*P, int*f)
{
int n = strlen(T), m = strlen(P);
getFail(P, f);
int j = 0;
int cnt=0;
for(int i = 0; i < n; i++)
{
while(j && P[j] != T[i])
{
j = f[j];
}
if(P[j] == T[i])
{
j++;
}
if(j == m)
{
cnt++;j=0; //改动的部位,注意j要置为0才不会叠加交叉的部分 ,也就是满足第二个样例
}
}
return cnt;
}
int main()
{
while(~scanf("%s",t))
{
getchar();
if(t[0]=='#') break;
scanf("%s",p);
int ans=find(t,p,pi);
printf("%d\n",ans);
getchar();
}
return 0;
}