hash 求助
查看原帖
hash 求助
571143
cloud2764scallop_eve楼主2023/12/14 20:05

题目为 P2292 [HNOI2004] L 语言,代码如下。

令问:这道题是不是没有 hash 的正解?

#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N = 1e6 + 5, mod = 1e6 + 7, bas = 131;
const double eps = 1e-5;
ull p[N * 2], vis[N * 2], sum[N * 2];
int n, m, f[N * 2];
char s[N * 2];
vector<pair<int, int>> vec[35];
void init() {
	p[0] = 1;
	for (int i = 1; i <= N * 2; i++)
		p[i] = p[i - 1] * bas;
}
inline int get_hash(ull x) {
	int u = x % mod;
	while (vis[u] && vis[u] != x) ++u;
	return u;
}
int main() {
//	freopen("language.in", "r", stdin);
//	freopen("language.out", "w", stdout);
	scanf("%d%d", &n, &m);
	init();
	for (int i = 1; i <= n; i++) {
		scanf("%s", s + 1);
		int len = strlen(s + 1);
		ull cnt = 0;
		for (int j = 1; j <= len; j++) {
			cnt = cnt * bas + s[j] - 'a' + 1;
		}
		int u = get_hash(cnt);
		vis[u] = cnt;
		vec[s[len] - 'a' + 1].push_back({u, len});
	}
	while (m--) {
		scanf("%s", s + 1);
		int len = strlen(s + 1);
		for (int i = 1; i <= len; i++)
			sum[i] = sum[i - 1] * bas + s[i] - 'a' + 1;
		f[0] = 1;
		int cnt = 0;
		for (int i = 1; i <= len; i++) {
			f[i] = 0;
			int x = s[i] - 'a' + 1;
			for (int j = 0; j < vec[x].size(); j++) {
				int len1 = vec[x][j].second;
				if (i < len1 || !f[i - len1]) continue;
				ull v = sum[i] - sum[i - len1] * p[len1];
				int h = get_hash(v);
				if (vis[h]) f[i] = 1, cnt = i;
			}
		}
		printf("%d\n", cnt);
	}
	return 0;
}
2023/12/14 20:05
加载中...