速度一定要比普通遍历方法快,求大佬🧍♂️
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 2e5 + 100;
int Next[MAXN];
int ans = 0;
void Priefix_Table(string pattern){
Next[0] = Next[1] = 0;
int j;
int len = pattern.length();
for(int i=1;i<len;i++){
j = Next[i];
while(j && pattern[i] != pattern[j]) j = Next[j];
if(pattern[i] == pattern[j]) Next[i+1] = j + 1;
else Next[i+1] = 0;
}
}
void KMP(string text, string pattern){
int len_text = text.length();
int len_pattern = pattern.length();
int j=0;
for(int i=0;i<len_text;i++){
while(j && text[i] != pattern[j]) j = Next[j];
if(text[i] == pattern[j]) j++;
if(j == len_pattern) ans++;
}
}
int main(){
string s1, s2;
cin >> s1 >> s2;//s1为父串,s2为子串
Priefix_Table(s2);
KMP(s1, s2);
cout << ans;
return 0;
}