找出第一个字符串在第二个字符串中出现次数
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
const int MAXN=100007;
string s,p;
int nextval[MAXN];
void getnext(string p){
int psize=p.size();
nextval[0]=-1;
int i=0,j=-1;
while(i<psize){
if(j==-1||p[i]==p[j]) {
nextval[++i]=++j;
}else {
j=nextval[j];
}
}
}
int KMP(string s,string p){
getnext(p);
int ssize=s.size();
int psize=p.size();
int i=0,j=0;
int ans=0;
while(i<ssize&&j<psize){
if(j==-1||s[i]==p[j]) {
i++;
j++;
}else j=nextval[j];
if(j==psize) {
j=nextval[j];//关键
ans++;
}
}
return ans;
}
int main(){
int n;
while(cin>>n){
while(n--){
cin>>p;
cin>>s;
cout<<KMP(s,p)<<endl;
}
}
}