题意:
从文本串种匹配模式串,要求找到最多有多少个互相不重叠的模式串。
思路:
这里要求匹配结果相互不重叠,只需要修改一下KMP算法,在每次匹配成功的时候,将j变为0即可。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1005;
char s[MAXN], t[MAXN];
int Next[MAXN];
void getNext(char *t) {
int m = strlen(t);
Next[0] = Next[1] = 0;
for (int i = 1; i < m; i++) {
int j = Next[i];
while (j && t[j] != t[i]) j = Next[j];
Next[i + 1] = t[j] == t[i] ? j + 1 : 0;
}
}
int kmp(char *s, char *t) {
int res = 0;
getNext(t);
int n = strlen(s), m = strlen(t);
int j = 0;
for (int i = 0; i < n; i++) {
while (j && s[i] != t[j]) j = Next[j];
if (s[i] == t[j]) ++j;
if (j == m) {
++res;
j = 0;
}
}
return res;
}
int main() {
while (scanf("%s", s), s[0] != '#') {
scanf("%s", t);
printf("%d\n", kmp(s, t));
}
return 0;
}