题意:给出两组单词,问第一组能在第二组中匹配几次;
本体要求深刻理解KMP的匹配原理, 问什么进行一个KMP匹配就可以的到所有的
匹配成功了,成功次数。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[1000005];
char str1[10005];
int n;
void getNext(char *p, int *next, int len) {
int i = 0;
int k = -1;
next[0] = -1;
while(i < len) {
if(k == -1 || p[k] == p[i]) {
k++;
i++;
next[i] = k;
}else {
k = next[k];
}
}
}
int KMP(char *str, char *p) {
int next[10005];
int j = 0, i = 0, k = 0;
int len = strlen(str);
int plen = strlen(p);
getNext(p, next,plen);
while(j < len) {
if(str[j] == p[i]) {
j++;
i++;
}else {
i = next[i];
if(i == -1) {
j++;
i = 0;
}
}
if(i == plen) //匹配成功了,成功次数统计。
//当i== Plen时, i 不是变成零, 而是 i = next[i];
//aa aaaaa;
k++;
}
return k;
}
int main()
{
scanf("%d", &n);
while(n--) {
scanf("%s%s", str1, str);
printf("%d\n", KMP(str, str1));
}
return 0;
}