给定一个字符串 A 和一个字符串 B,求 A 在 B 中的出现次数。A 和 B 中的字符均为英语大写字母或小写字母。
例如:
输入:
abcdabcd
abcdabcdabcdabcd
输出:
2
此代码输出1
求纠错
#include <bits/stdc++.h>
#define ULL unsigned long long
using namespace std;
const int N = 2e6 + 10;
const int B = 1331;
ULL h[N], base[N];
void init(string s) {
memset(base, 0, sizeof base);
memset(h, 0, sizeof h);
base[0] = 1;
for (int i = 1; i <= s.size(); i++) {
h[i] = h[i - 1] * B + s[i - 1];
base[i] = base[i - 1] * B;
}
}
ULL Hash(int l, int r) {
return h[r] - h[l - 1] * base[r - l + 1];
}
int main() {
string a, b;
cin >> a >> b;
init(a);
long long s1 = Hash(0, a.size() - 1);
long long ans = 0;
init(b);
for (int i = 0; i <= b.size() - a.size() + 2; i++) {
if(b[i] == a[1]) {
long long s2 = Hash(i - 1, a.size() + i - 2);
if(s1 == s2)
ans++;
}
}
cout << ans;
return 0;
}