KMP算法
有时候读字符串会T,要用scanf
getnext()是KMP算法的核心
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int ans=0;
char matching[1000005];
char pattern[10005];
int next1[10005];
int lenp,lenm;
void getnext() { //存next1[]核心!
int j=0,k=-1;
next1[0]=-1;
while(j<lenp) {
if(k==-1||pattern[j]==pattern[k]) {
j++;
k++;
next1[j]=k;
} else
k=next1[k];
}
}
int kmp() { //匹配
int i=0,j=0;
getnext();
while(i<lenm) {
if(j==-1||matching[i]==pattern[j]) {
i++;
j++;
} else
j=next1[j];
if(j==lenp) {//如果匹配到了,该怎么做
//j=next1[j];指的是接着匹配,如果令j=0,则代表从现在匹配到的后面开始匹配
//abcab----ab,第一次匹配ab后,下次匹配串相当于cab了
//如果return i-lenp+1;则代表输出模式串在匹配串中的位置,abcd-->c,return 3
ans++;
j=next1[j];
}
}
return ans;
}
int main() {
int t;
cin>>t;
while(t--) {
ans=0;
cin>>pattern>>matching;
lenm=strlen(matching);//匹配串
lenp=strlen(pattern);//模式串
cout<<kmp()<<endl;
}
return 0;
}