哈希被卡,求可过的模数和底数,玄关
查看原帖
哈希被卡,求可过的模数和底数,玄关
700558
williamwei楼主2024/12/24 20:00
#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是模数

2024/12/24 20:00
加载中...