a是主串,b是模式串,ans是模式串在主串的出现次数。
int j = 0, ans = 0, m = strlen(b+1), n = strlen(a+1);
nxt[1] = 0;
for(int i = 2; i <= m; i++) {
while(j && b[j+1] != b[i]) j = nxt[j];
if(b[i] == b[j+1]) j++;
nxt[i] = j;
}
j = 0;
for(int i = 1; i <= n; i++) {
while(j && a[i] != b[j+1]) j = nxt[j];
if(a[i] == b[j+1]) j++;
if(j == m) j = nxt[j], ans++;
}