STL+KMP
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int i,len,sum;
char *p;
char a[3005],b[3005];
while(scanf("%s",a)&&a[0]!='#')
{
scanf("%s",b);
len=strlen(b);
sum=0;
for(i=0,p=a;p=strstr(p,b);p+=len)
{
sum++;
}
printf("%d\n",sum);
}
return 0;
}
#include <cstdio>
#include <cstring>
#define MAXN 1000000
using namespace std;
char p[MAXN],s[MAXN]; //s 母串
int next[MAXN];
void get_next(char *P,int *next,int len1)
{
int j,k;
j=0;k=-1;next[0]=-1;
while(j<len1)
{
if(k==-1||p[j]==p[k])
{
j++;k++;
next[j]=k;
}
else
k=next[k];
}
}
int kmp()
{
int i,j,k,len1,len2,t;
i=0;j=0;k=0;
len1=strlen(p);
len2=strlen(s);
get_next(p,next,len1);
while(i<len2)
{
t=i; //去掉为可重叠
if(s[i]==p[j])
{ i++;j++; }
else
{
if(j==-1)
{i++;j=0;}
else
j=next[j];
}
if(j==len1)
{k++;i=t+len1;} //可重叠为k++;
}
return k;
}
int main()
{
int n;
while(scanf("%s",s)&&s[0]!='#')
{
scanf("%s",p);
printf("%d\n",kmp());
}
return 0;
}