kmp 模板

来源:互联网 发布:excel sql 编辑:程序博客网 时间:2024/05/22 09:49
#include<iostream>#include<algorithm>#include<string>#include<cstring>using namespace std;#define MAXN 1000005int Next[MAXN];char p[MAXN], s[MAXN];//p为模式串,s为原串  //next数组的求法void GetNext(char *p, int *next) {int pLen = strlen(p);next[0] = -1;int k = -1;int j = 0;while (p[j]){//p[k]表示前缀,p[j]表示后缀if (k == -1 || p[j] == p[k]) {++j;++k;next[j] = k;}else k = next[k];}}//kmp算法int KmpSearch(char *s, char *p){int count = 0;int i = 0, j = 0;int sLen = strlen(s);int pLen = strlen(p);while (i < sLen)//如果用i<strlen(s),每次判断的时候时间都是O(n)可能会TLE {//如果j=-1,或者当前字符匹配成功(即s[i]==p[j])都令i++,j++if (j == -1 || s[i] == p[j]) {i++; j++;}else {//如果j!=-1,且当前字符匹配失败(即s[i]!=p[j]),则令i不变,j=next[j]//next[j]即为j所对应的next值j = Next[j];}if (j == pLen) {count++;j = Next[j];}}return count;}int main(){int N;cin >> N;while (N--){memset(Next, 0, sizeof(Next));cin >> p;cin >> s;GetNext(p, Next);cout << KmpSearch(s, p) << endl;}return 0;}

原创粉丝点击