char mo[10005]; //模式串
char str[1000005]; //原串
求next数组(其实应该叫最大前缀长数组)
int next[10005] = {-1};
int i = 0, j = -1, len = strlen(mo);
while(i < len) { //获得next函数
if(j == -1 || mo[i] == mo[j]) next[++i] = ++j;
else j = next[j];
}
求匹配次数
int ans = 0, len1 = strlen(str);
i = j = 0;
while(i < len1) { //求模式串在原串中出现的次数
if(j == -1 || str[i] == mo[j]) ++i, ++j;
else j = next[j];
if(j == len) ans++;
}