KMP模板
题目链接:
#include <iostream>
#include <string>
using namespace std;
int kmp(string t, string p) {
int ans=0;
int plen=p.length();
int next[plen],nextval[plen];
next[0]=0;
nextval[0]=-1;
int index=0;
for(int i=1;i<plen;++i) {
while(p[index]!=p[i]) {
index=nextval[index];
if(index==-1) {
break;
}
}
++index;
next[i]=index;
nextval[i]=next[i-1];
}
int tlen=t.length();
int i=0;
int j=0;
while(i<tlen) {
while(t[i]!=p[j]) {
j=nextval[j];
if(j==-1) {
++i;
++j;
break;
}
}
if(t[i]==p[j]) {
if(j==plen-1) {
++ans;
j=nextval[j];
if(j==-1) {
++i;
++j;
}
} else {
++i;
++j;
}
}
}
return ans;
}
int main() {
int cnt;
cin>>cnt;
string t,p;
while(cnt--) {
cin>>p;
cin>>t;
cout<<kmp(t,p)<<endl;
}
return 0;
}