求助,悬关
  • 板块学术版
  • 楼主midsummer_zyl
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/10/29 15:06
  • 上次更新2023/11/2 10:53:32
查看原帖
求助,悬关
1025321
midsummer_zyl楼主2023/10/29 15:06

题目描述:

给定一个字符串 AA 和一个字符串 BB,求 AA 在 BB 中的出现次数。AA 和 BB 中的字符均为英语大写字母或小写字母。

例如:

输入:

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;
}
2023/10/29 15:06
加载中...