这个主要是next数组比较难理解。
但是详细视频这个绝对能让你所有的疑惑都排除,绝了。
贴一个hdu1686的
#include <iostream>
#include <string.h>
using namespace std;
const int maxn = 1e4 + 50;
const int maxn2 = 1e6 + 50;
char pattern[maxn], text[maxn2];
int _next[maxn];
void build() {
int n = strlen(pattern);
for (int i = 0, j = _next[0] = -1; i < n; _next[++i] = ++j) {
while(~j && pattern[j] != pattern[i]) j = _next[j];
}
}
int match() {
build();
int n = strlen(pattern), m = strlen(text);
int ans = 0;
for (int i = 0, j = 0; i < m; i++) {
while(j > 0 && pattern[j] != text[i]) j = _next[j];
if (pattern[j] == text[i]) ++j;
if (j == n) ans++, j = _next[j];
}
return ans;
}
int main()
{
int T; scanf("%d", &T);
while(T--) {
scanf("%s", &pattern);
scanf("%s", &text);
printf("%d\n",match());
}
return 0;
}