子串查找
题目链接 LibreOJ-103
题目描述
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int nxt[N];
void GetNext(string p, int nxt[])
{
nxt[0] = -1;
int i = 0 , j = -1;
int pLen = p.size();
while(i < pLen)
{
if(j == -1 || p[i] == p[j]){
i++,j++;
nxt[i]=j;
}
else
j=nxt[j];
}
}
int KMP(string s,string p)
{
int i=0,j=0,ans=0;
int sLen=s.size();
int pLen=p.size();
while(i<sLen && j<pLen)
{
if(j ==-1 || s[i]==p[j]){
i++,j++;
}
else{
j=nxt[j];
}
if(j==pLen){
ans++;
j = nxt[j];
}
}
return ans;
}
int main()
{
string s,p;
cin>>s>>p;
GetNext(p,nxt);
cout<<KMP(s,p)<<endl;
}