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;
}
posted @ 2021-07-22 18:11  cheems~  阅读(26)  评论(0编辑  收藏  举报