这道题是KMP模板题,具体的KMP我会单独写一篇博客来讲述。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int ans,next[1010010],longys,longmbs;
char ys[1001010],mbs[1001010];
void find_next()
{
int k=0;
for(int i=2; i<=longmbs; i++)
{
while(k>0&&mbs[k+1]!=mbs[i])
k=next[k];
if(mbs[k+1]==mbs[i])
k++;
next[i]=k;
}
}
void kmp()
{
find_next();
int k=0;
for(int i=1; i<=longys; i++)
{
while(k>0&&mbs[k+1]!=ys[i])
k=next[k];
if(mbs[k+1]==ys[i])
k++;
if(k==longmbs)
{
ans++;
k=next[k];
}
}
}
int main()
{
scanf("%s",ys+1);
scanf("%s",mbs+1);
longys=strlen(ys+1);
longmbs=strlen(mbs+1);
kmp();
cout<<ans;
return 0;
}