本地 AC OJ RE
查看原帖
本地 AC OJ RE
531206
intemist楼主2024/1/1 14:32

不知道怎么回事 去 loj 交了一发结果样例 re 了 应该是 namespace uniset 那里的问题 一直查不出来,,,

#include <bits/stdc++.h>
#define pb emplace_back
#define int long long

using namespace std;
inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (! isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
	while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getchar(); }
	return x * f;
}

const int maxn = 3e5 + 10; char s[maxn]; vector<int> vec[maxn];
int n, m, a[maxn], rk[maxn], he[maxn], cnt[maxn], rx[maxn << 1], x[maxn], ans[maxn], sa[maxn], y[maxn];

void SA() {
	for (int i = 1; i <= n; i ++) cnt[x[i] = s[i] - 'a' + 1] ++;
	for (int i = 2; i <= m; i ++) cnt[i] += cnt[i - 1];
	for (int i = 1; i <= n; i ++) sa[cnt[x[i]] --] = i;

	for (int k = 1; k <= n; k <<= 1) {
		int tot = 0;
		for (int i = n - k + 1; i <= n; i ++) y[++ tot] = i;
		for (int i = 1; i <= n; i ++) if (sa[i] > k) y[++ tot] = sa[i] - k;
		
		for (int i = 1; i <= m; i ++) cnt[i] = 0;
		for (int i = 1; i <= n; i ++) cnt[x[i]] ++;
		for (int i = 2; i <= m; i ++) cnt[i] += cnt[i - 1];
		for (int i = n; i >= 1; i --) sa[cnt[x[y[i]]] --] = y[i];
		for (int i = 1; i <= n; i ++) rx[i] = x[i], x[i] = 0;

		tot = 1, x[sa[1]] = 1;
		for (int i = 2; i <= n; i ++) {
			int nw = sa[i], lst = sa[i - 1];
			if (rx[nw] == rx[lst] && rx[nw + k] == rx[lst + k])
				x[nw] = tot; else x[nw] = ++ tot;
		}

		m = tot;
	}

	int lst = 0;
	for (int i = 1; i <= n; i ++) rk[sa[i]] = i;
	for (int i = 1; i <= n; i ++) {
		if (rk[i] == 1) continue;
		int j = sa[rk[i] - 1]; lst = max(0ll, lst - 1);
		while (max(i, j) <= n && s[i + lst] == s[j + lst]) lst ++;
		he[rk[i]] = lst;
	}
}

void chmax(int &a, int b) { a = max(a, b); }
void chmin(int &a, int b) { a = min(a, b); }
namespace uniset {
	int fa[maxn], mn[maxn], mx[maxn], sz[maxn];
	
	void init() { for (int i = 1; i <= n; i ++) fa[i] = i, sz[i] = 1, mn[i] = mx[i] = a[sa[i]]; }
	int fnd(int x) { return x == fa[x] ? x : fa[x] = fnd(fa[x]); } 
	int merg(int x) { int l = fnd(x - 1), r = fnd(x);
		cnt[he[x]] += sz[l] * sz[r], chmax(ans[he[x]], max(mx[l] * mx[r], mn[l] * mn[r]));
		fa[l] = r, sz[r] += sz[l], chmax(mx[r], mx[l]), chmin(mn[r], mn[l]); }
}

signed main() {
	
	n = read(), scanf("%s", s + 1), m = 26, SA();
	for (int i = 1; i <= n; i ++) a[i] = read(), cnt[i] = 0;
	for (int i = 2; i <= n; i ++) vec[he[i]].pb(i); cnt[0] = 0;

	uniset :: init(), memset(ans, ~0x3f, sizeof ans);
	for (int i = n; i >= 0; i --) for (int t : vec[i]) uniset :: merg(t);
    for (int i = n - 2; i >= 0; i --) cnt[i] += cnt[i + 1], chmax(ans[i], ans[i + 1]);
	for (int i = 0; i < n; i ++) printf("%lld %lld\n", cnt[i], ans[i] < -1e18 ? 0 : ans[i]);

	return 0;
}
2024/1/1 14:32
加载中...