据说用后缀自动机 + dp也能做

然而并不会

后缀数组的做法呢

就是先建个后缀数组,求出height值,此时如果直接找,复杂度是n ^ 2的,肯定会超时。

但是height大的值是不会对小的产生影响的,所以可以按height大小,从大到小合并两个区间,用并查集维护就可以了

代码如下

 #include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = ;
typedef long long ll;
char s[N];
ll a[N];
int n;
int sa[N], c[N], x[N], y[N]; struct E {
int h, l, r;
inline bool operator < (const E o) const {
return h > o.h;
}
} g[N];
inline void BuildSa(int m) {
for (int i = ; i < m; i++) c[i] = ;
for (int i = ; i < n; i++) c[x[i] = s[i]]++;
for (int i = ; i < m; i++) c[i] += c[i - ];
for (int i = n - ; i >= ; i--) sa[--c[x[i]]] = i;
for (int k = ; k <= n; k <<= ) {
int p = ;
for (int i = n - k; i < n; i++) y[p++] = i;
for (int i = ; i < n; i++) if (sa[i] >= k) y[p++] = sa[i] - k;
for (int i = ; i < m; i++) c[i] = ;
for (int i = ; i < n; i++) c[x[y[i]]]++;
for (int i = ; i < m; i++) c[i] += c[i - ];
for (int i = n - ; i >= ; i--) sa[--c[x[y[i]]]] = y[i];
p = ; swap(x, y);
x[sa[]] = ;
for (int i = ; i < n; i++)
x[sa[i]] = y[sa[i]] == y[sa[i - ]] && y[sa[i] + k] == y[sa[i - ] + k] ? p - : p++;
if (p >= n) break;
m = p;
}
} int height[N], rank[N];
inline void GetHeight() {
for (int i = ; i < n; i++) rank[sa[i]] = i;
int k = ;
for (int i = ; i < n; i++) {
if (k) k--;
int j = sa[rank[i] - ];
while (s[j + k] == s[i + k]) k++;
height[rank[i]] = k;
}
} ll fa[N], size[N], ans[N], ans1[N], ans2[N], minn[N], maxn[N];
void Union(int x, int y) {
fa[x] = y;
size[y] += size[x];
ans[y] = max(ans[y], max(maxn[y] * maxn[x], minn[y] * minn[x]));
maxn[y] = max(maxn[y], maxn[x]);
minn[y] = min(minn[y], minn[x]);
} int find(int x) {
return (fa[x] == x) ? x : find(fa[x]);
} int main() {
scanf("%d", &n);
getchar();
for (int i = ; i < n; i++)
scanf("%c", &s[i]), s[i] -= 'a' - ;
for (int i = ; i < n; i++)
scanf("%lld", &a[i]);
s[n++] = ;
BuildSa();
GetHeight();
for (int i = ; i < n; i++) {
g[i].h = height[i];
g[i].l = sa[i];
g[i].r = sa[i - ];
}
sort(g + , g + n);
for (int i = ; i < n; i++) fa[i] = i, size[i] = , maxn[i] = a[i], minn[i] = a[i];
memset(ans, 0x80, sizeof(ans));
memset(ans2, 0x80, sizeof(ans2));
for (int i = ; i < n; i++) {
int x = find(g[i].l);
int y = find(g[i].r);
ans1[g[i].h] += (ll)size[x] * size[y];
Union(x, y);
ans2[g[i].h] = max(ans2[g[i].h], ans[y]);
}
for (int i = n - ; i >= ; i--) {
ans1[i] += ans1[i + ];
if (ans1[i + ]) ans2[i] = max(ans2[i], ans2[i + ]);
}
for (int i = ; i < n - ; i++) printf("%lld %lld\n", ans1[i], ans1[i] ? ans2[i] : );
return ;
}

bzoj4199: [Noi2015]品酒大会 (并查集 && 后缀数组)的更多相关文章

  1. [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集

    [UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...

  2. [UOJ#131][BZOJ4199][NOI2015]品酒大会

    [UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...

  3. bzoj4199: [Noi2015]品酒大会(后缀数组)

    题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...

  4. [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp

    品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...

  5. BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】

    题目 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎手"两个奖项,吸 ...

  6. [BZOJ4199][NOI2015]品酒大会

    #131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项, ...

  7. 并不对劲的bzoj4199: [Noi2015]品酒大会

    传送门-> 又称普及大会. 这题没什么好说的……后缀自动机裸题……并不对劲的人太菜了,之前照着标程逐行比对才过了这道题,前几天刚刚把这题一遍写对…… 这题的输出和某两点相同后缀的长度有关,那么把 ...

  8. bzoj千题计划257:bzoj4199: [Noi2015]品酒大会

    http://www.lydsy.com/JudgeOnline/problem.php?id=4199 求出后缀数组的height 从大到小枚举,合并 维护组内 元素个数,最大.次大.最小.次小 # ...

  9. [BZOJ4199][Noi2015]品酒大会 树形DP+后缀自动机

    由于要找后缀的前缀,所以先用反串建立SAM. link边组成了后缀树. 两个子串的最长公共前缀是LCA的step 树形dp即可. #include<iostream> #include&l ...

随机推荐

  1. Easyui-Tree和Combotree使用注意事项-sunziren

    版权声明:本文为sunziren原创文章,博客园首发,转载务必注明出处以及作者名称. Easyui-Tree和Combotree所使用的数据结构是类似的,在我的上一篇文章<Easyui-Tree ...

  2. FirstJavaWeb

    (未完成)出错有点多,Tomcat的配置也出问题了,Tomcat突然找不到jdk了,好像是我之前下载过一回然后没卸干净有残留文件,还有连接数据库的代码也有问题.       <%@page im ...

  3. 关于Swagger会报AbstractSerializableParameter类的异常问题

    SpringBoot-2.2.1.RELEASE 集成 swagger-ui-2.9.2 时,每次在访问到页面时总是报AbstractSerializableParameter类的异常错误,大概内容如 ...

  4. Firefox下载.net服务器文件时中文乱码

    ASP.NET中产生一个Excel报表,供浏览器下载.显然,下载时经常有汉字报表名称.针对当前的两个主流的浏览器IE和Firefox,似乎没有兼容的解决办法.网上搜索了一些解决方法,但在Firefox ...

  5. 针对mysql8.0报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create

    折腾了好久,后来发现是版本问题,驱动和数据库不匹配导致. 原来用的是5.1.37的驱动.数据库是mysql5.7,可以连接成功. 就在我把数据库换成了8.0之后,所有的买点啥都报标题里的错误了.   ...

  6. 如果linux开机没有ip怎么办

    1.vim编辑网卡配置文件,修改如下参数 [root@s25linux tmp]# cd /etc/sysconfig/network-scripts/vim修改此文件,找到如下参数,改为yesONB ...

  7. (三)运用Python模块和包

    1 引言 为了能够在Python项目中高效地运用Python模块和包,我们需要进一步地来了解它们是如何在Python项目中进行定义.使用和工作的. 2 Python模块和包 Python模块和包的基本 ...

  8. 最短路-A - 畅通工程续

    A - 畅通工程续 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这 ...

  9. javascript初学笔记

    基本语句 赋值条件循环语句 javascript异常处理语句 trycatchfinally语句 Error对象 throw语句 函数 定义 调用 嵌套函数 函数的嵌套定义 内置函数 匿名函数和Fun ...

  10. centos7最小版配置

    配置启用dns cd /etc/sysconfig/network-scripts/ vi ifcfg-ens33 # 修改ONBOOT为yes ONBOOT=yes 重启系统 reboot 安装ne ...