社区讨论

哈希被卡,求可过的模数和底数,玄关

CF547EMike and Friends参与者 5已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@m52f25mn
此快照首次捕获于
2024/12/24 20:02
去年
此快照最后确认于
2025/11/04 23:19
4 个月前
查看原帖
CPP
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <vector>
#include <tuple>
#include <chrono>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
typedef long long ll;
const int maxn = 4e5 + 10;
const int maxm = 1000 + 10;
const int maxq = 5e5 + 10;
const int B = 12347;
const int P = 1e9 + 7;
int n, m, k, a[maxn], b[maxn], h[maxn], p[maxn], val[maxn], len[maxn], res[maxq];
string s, t;
vector<tuple<int, int, int, int> > e[maxm];
const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count();
struct chash {int operator()(int x) const { return x ^ RANDOM; }};
__gnu_pbds::gp_hash_table<int, int, chash> mp;
int query(int l, int r) {return ((h[r] - (ll)h[l - 1] * b[r - l + 1]) % P + P) % P;}
int main() {
	ios::sync_with_stdio(false);
	cin >> n >> m; s = "#";
	for (int i = 1; i <= n; i++) {
		cin >> t, p[i] = s.size(), s += t;
		s.push_back('#'), a[++k] = len[i] = t.size();
		for (char ch : t) val[i] = ((ll)val[i] * B + ch - 'a') % P;
	}
	sort(a + 1, a + k + 1); k = unique(a + 1, a + k + 1) - a - 1; b[0] = 1; n = s.size() - 1;
	for (int i = 1; i <= n; i++) h[i] = ((ll)h[i - 1] * B + s[i] - 'a') % P, b[i] = (ll)b[i - 1] * B % P;
	for (int i = 1, l, r, K; i <= m; i++) {
		cin >> l >> r >> K;
		int P = lower_bound(a + 1, a + k + 1, len[K]) - a;
		e[P].emplace_back(p[l] - 1, i, val[K], -1);
		e[P].emplace_back(p[r] + len[r] - len[K], i, val[K], 1);
	}
	for (int i = 1; i <= k; i++) {
		sort(e[i].begin(), e[i].end());
		int cur = 1; mp.clear();
		for (auto [p, id, v, w] : e[i]) {
			for (; cur <= p; cur++) ++mp[query(cur, cur + a[i] - 1)];
			res[id] += mp[v] * w;
		}
	}
	for (int i = 1; i <= m; i++) cout << res[i] << '\n'; 
	return 0;
} 
B是底数 P是模数

回复

11 条回复,欢迎继续交流。

正在加载回复...