社区讨论

求助

灌水区参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lobitlwb
此快照首次捕获于
2023/10/29 21:42
2 年前
此快照最后确认于
2023/11/04 02:49
2 年前
查看原帖
CPP
#include <set>
#include <string>
#include <unordered_map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define File(_) freopen(#_".in", "r", stdin);freopen(#_".out", "w", stdout)
#define Debug(_) freopen(#_".in", "r", stdin);freopen("debug.out", "w", stdout)
#define fo(i, a, b) for (int i = a; i <= b; ++i)
#define fd(i, a, b) for (int i = a; i >= b; --i)
#define init(a, b) memset(a, b, sizeof a)
#define gc getchar()
#define N 100010
#define mod1 1000000007
#define mod2 1000000009
#define inf 0x3f3f3f3f
#define db double
#define ll long long
using namespace std;
char s[N];
int cnt, num[500], bz[N], qs1[N], qs2[N], sum1[N], sum2[N], pw1[N], pw2[N];
unordered_map <pair<int, int>, pair<int, int> > mp;
int main()
{
	File(language);
	int n, q;
	scanf("%s", s + 1);
	n = strlen(s + 1);
	scanf("%d", &q);
	pw1[0] = pw2[0] = 1;
	fo (i, 1, n)
	{
		pw1[i] = pw1[i - 1] * 31 % mod1;
		pw2[i] = pw2[i - 1] * 29 % mod2;
	}
	fo (i, 1, q)
	{
		string ea;
		cin >> ea;
		int lim = ea.size();
		fo (j, 0, lim - 1)
		{
			qs1[i] = (qs1[i] * 31 % mod1 + ea[i] - 'a' + 1) % mod1;
			qs2[i] = (qs2[i] * 29 % mod2 + ea[i] - 'a' + 1) % mod2;
		}
		mp[make_pair(qs1[i], qs2[i])].first = 1;
	}
	fo (i, 1, n)
	{
		sum1[i] = (sum1[i - 1] * 31 % mod1 + s[i] - 'a' + 1) % mod1;
		sum2[i] = (sum2[i - 1] * 29 % mod2 + s[i] - 'a' + 1) % mod2;
		fo (j, 1, cnt)
			if (num[j] <= i)
			{
				pair <int, int> mos = make_pair(sum1[i] - sum1[i - num[j]] * pw1[num[j]] % mod1, sum2[i] - sum2[i - num[j]] * pw2[num[j]] % mod2);
				if (mp[mos].first && mp[mos].second <= i - num[j])
				{
					++mp[mos].first;
					mp[mos].second = i;
				}
			}
	}
	fo (i, 1, q)
		printf("%d\n", mp[make_pair(qs1[i], qs2[i])].first - 1);
	return 0;
}
用unordered_map做双哈希,编译过不去,求助大佬是什么原因

回复

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

正在加载回复...