KMP裸题,每次匹配完从头开始就好了
#include<bits/stdc++.h>
#define pt(ch) (Top<1000000?St[Top++]=ch:(fwrite(St,1,1000000,stdout),St[(Top=0)++]=ch))
using namespace std;
int Top;static char St[1000000];
const int maxn=(1e3)+5;
int LT,LP,Ans,nxt[maxn];char P[maxn],T[maxn];
void write(int x){if(x<0) x=-x,pt('-');if(x>9) write(x/10);pt(x%10+'0');}
int main(){
for(scanf("%s",T);T[0]!='#';scanf("%s",T)){
scanf("%s",P),LP=strlen(P),LT=strlen(T);
int j=0,k=-1;nxt[0]=-1;
while(j<LP) if(k==-1||P[j]==P[k]) nxt[++j]=++k;else k=nxt[k];
j=0,k=0,Ans=0;
while(j<LT){
if(k==-1||T[j]==P[k]) j++,k++;else k=nxt[k];
if(k==LP) Ans++,k=0;
}
write(Ans),pt('\n');
}
fwrite(St,1,Top,stdout);
return 0;
}