不知道怎么回事 去 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;
}