题目:
找出子串在母串里面出现的次数。
题解:
用KMP求解。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 1;
int ans = 0;
void getNext(const string& s, int next[]) {
next[0] = -1;
int k = -1;
int j = 0;
while (j < (int)s.length() - 1) {
if (k == -1 || s[k] == s[j]) { //先让前一位比较,再++j
next[++j] = ++k;
}
else {
k = next[k]; //前一位比较后不同
}
}
}
void deal(const string& s, const string& t) {
int len = t.length();
int* next = new int[len];
memset(next, 0, sizeof(next));
getNext(t, next);
int i = 0, j = 0;
while (i < (int)s.length()) { //intellect
//tell
if (j == -1 || s[i] == t[j]) {
++i, ++j;
}
else {
j = next[j];
}
if (j == t.length()) {
++ans; j = 0;
}
}
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
string a, b;
cin >> a >> b;
deal(a, b);
printf("%d\n", ans);
return 0;
}