社区讨论

WA70 求助

P3498[POI 2010] KOR-Beads参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lzjtwqu2
此快照首次捕获于
2024/08/07 20:32
2 年前
此快照最后确认于
2024/08/07 21:29
2 年前
查看原帖
萌新刚学字符串哈希,求助大佬。
CPP
#include <bits/stdc++.h>
using namespace std;
#define ll unsigned long long
#define int ll
#define N 200010
ll ha[N], has1[N], has2[N];
int cnt[N], a[N], n;
set < ll > ss;
vector < int > ans[N];
const ll base = 133333331, p = 1e9 + 7;
ll get1(int l, int r) {
	return (has1[r] - has1[l - 1] * ha[r - l + 1] % p + p) % p;
}
ll get2(int l, int r) {
	return (has2[l] - has2[r + 1] * ha[r - l + 1] % p + p) % p;
}
signed main() {
//	freopen("P3498.in", "r", stdin);
//	freopen("P3498.out", "w", stdout);
	scanf("%llu", &n);
	for (int i = 1; i <= n; ++i) scanf("%llu", a + i);
	ha[0] = 1;
	for (int i = 1; i <= n; ++i) {
		ha[i] = ha[i - 1] * base % p;
		has1[i] = (has1[i - 1] * base % p + 1ll * a[i]) % p;
	}
	for (int i = n; i; --i) 
		has2[i] = (has2[i + 1] * base % p + 1ll * a[i]) % p;
	
	ll tmp1, tmp2;
	for (int k = 1; k <= n; ++k) {
		ss.clear(); 
		for (int i = 1; i <= n - k + 1; i += k) {
			tmp1 = get1(i, i + k - 1) % p;
			tmp2 = get2(i, i + k - 1) % p;
			ss.insert(min(tmp1, tmp2));
	//		printf("%d %d-%d %d****\n", k, i, i, i + k - 1);
		}
		for (ll i : ss) ++cnt[k];
		ans[cnt[k]].push_back(k);
	//	printf("%d--%d\n", cnt[k], k);
	}
	sort(cnt + 1, cnt + n + 1);
	printf("%llu %llu\n", cnt[n], ans[cnt[n]].size());
	for (int i : ans[cnt[n]]) printf("%llu ", i);
	return 0;
}
WA #7 #9,实在挑不出来了 /ll

回复

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

正在加载回复...