[NOI2015] 品酒大会 题解
[NOI2015] 品酒大会 题解
题目大意
给定一个长度为 的字符串 ,和第 个位置的权值
对于每一个 ,求满足 的 的对数
以及所有的 中, 的最大值
题解
1
可以转化为倒序枚举 后求 的 数量以及最大值。
求后缀和、 后缀最大值
2
由于 是 上连续的一段 的最小值
实际上就是要求区间最小值为 的区间个数
3
将 降序排序,按照顺序加入。
每次在 插入一个数,就是合并两堆数,即 和 所在堆与 合并。
用并查集维护大小、最值即可。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e5 + 5;
int n, sa[N], rk[N], old[N], t[N], id[N], m, h[N];
int fa[N], sz[N];
LL a[N], mx[N], mn[N], s1[N], s2[N], cnt, res = -1e18;
char str[N];
inline void rs() {
for (int i = 1; i <= m; i++) t[i] = 0;
for (int i = 1; i <= n; i++) ++t[rk[i]];
for (int i = 1; i <= m; i++) t[i] += t[i - 1];
for (int i = n; i >= 1; i--) sa[t[rk[id[i]]]--] = id[i], id[i] = 0;
}
inline int EQ(int x, int y, int k)
{ return old[x] == old[y] && old[x + k] == old[y + k]; }
inline void bui() {
m = 200;
for (int i = 1; i <= n; i++) rk[i] = str[i], id[i] = i;
rs();
for (int k = 1, p; k <= n; k <<= 1) {
p = 0;
for (int i = n - k + 1; i <= n; i++) id[++p] = i;
for (int i = 1; i <= n; i++) if (sa[i] > k) id[++p] = sa[i] - k;
rs(), memcpy(old, rk, sizeof(rk)), p = 0;
for (int i = 1; i <= n; i++) rk[sa[i]] = EQ(sa[i], sa[i - 1], k) ? p : ++p;
if (p == n) break;
m = p;
}
for (int i = 1, j, k = 0; i <= n; h[rk[i++]] = k)
for (k ? --k : 0, j = sa[rk[i] - 1]; str[i + k] == str[j + k]; k++);
}
int fd(int x) {
while (fa[x] ^ x) x = fa[x] = fa[fa[x]];
return x;
}
vector<int> b[N];
inline void mer(int x, int y) {
x = fd(x), y = fd(y);
cnt += 1ll * sz[x] * sz[y], res = max(res, max(mx[x] * mx[y], mn[x] * mn[y]));
fa[y] = x, sz[x] += sz[y], mx[x] = max(mx[x], mx[y]), mn[x] = min(mn[x], mn[y]);
}
int main() {
scanf("%d%s", &n, str + 1);
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
bui();
for (int i = 1; i <= n; i++) {
fa[i] = i, sz[i] = 1, mx[i] = mn[i] = a[sa[i]];
b[h[i]].push_back(i);
}
for (int i = n - 1; ~i; i--) {
// for (int x : b[i]) mer(x, x - 1);
int le = b[i].size();
for (int j = 0; j < le; j++) mer(b[i][j], b[i][j] - 1);
if (cnt) s1[i] = cnt, s2[i] = res;
}
for (int i = 0; i < n; i++) printf("%lld %lld\n", s1[i], s2[i]);
}
本文作者:小蒟蒻laf
本文链接:https://www.cnblogs.com/KonjakLAF/p/16692651.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步