题意:问一个A串可以剪多少个B串。
分析:kmp水题
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAX_P 1005
#define MAX_T 1005
using namespace std;
char P[MAX_P];
char T[MAX_T];
int NEXT[MAX_P];
int cnt;
void makeNext(void)
{
int q,k;
int m=strlen(P);
NEXT[0]=0;
for(q=1,k=0;q<m;q++)
{
while(k>0&&P[q]!=P[k])
k=NEXT[k-1];
if(P[q]==P[k])
k++;
NEXT[q]=k;
}
return ;
}
int kmp(void)
{
int len_t=strlen(T);
int len_p=strlen(P);
makeNext();
for(int i=0,q=0;i<len_t;i++)
{
while(q>0&&P[q]!=T[i])
q=NEXT[q-1];
if(P[q]==T[i])
q++;
if(q==len_p)
{
cnt++;
q=0;
}
}
return cnt;
}
int main(void)
{
while(scanf("%s",T)==1)
{
if(T[0]=='#')
break;
scanf(" %s",P);
cnt=0;
int ans=kmp();
printf("%d\n",ans);
}
return 0;
}