BZOJ_4199_[Noi2015]品酒大会_后缀自动机
BZOJ_4199_[Noi2015]品酒大会_后缀自动机
Description
一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品
Input
Output
输出文件包括 n 行。第 i 行输出 2 个整数,中间用单个空格隔开。
Sample Input
ponoiiipoi
2 1 4 7 4 8 3 6 4 7
Sample Output
45 56
10 56
3 32
0 0
0 0
0 0
0 0
0 0
0 0
0 0
先只考虑相似度等于i的两个答案ans1[i],ans2[i],最后再整个递推一遍。
ans1[i],ans2[i]对应后缀树上深度为i的答案。
ans1[i]是比较好求的,类似差异那道题,用siz[fa[p]]*siz[p]计算贡献,因为后缀树上LCA深度就等于两子串的LCP长度。
然后ans2[i],由于题中a[i]可能有负数,要同时维护maxn[i],minn[i]表示i子树内的最大/最小值。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 300050
typedef long long ll;
#define inf 0x3f3f3f3f
int n,ch[N<<1][26],fa[N<<1],dep[N<<1],cnt=1,lst=1,val[N];
int ws[N<<1],a[N<<1],siz[N<<1],maxn[N<<1],minn[N<<1];
char w[N];
ll ans1[N],ans2[N];
int head[N<<1],to[N<<1],nxt[N<<1],tot;
inline void add(int u,int v) {
to[++tot]=v; nxt[tot]=head[u]; head[u]=tot;
}
void insert(int x) {
int p=lst,np=++cnt,q,nq;
lst=np; dep[np]=dep[p]+1;
for(;p&&!ch[p][x];p=fa[p]) ch[p][x]=np;
if(!p) fa[np]=1;
else {
q=ch[p][x];
if(dep[q]==dep[p]+1) fa[np]=q;
else {
fa[nq=++cnt]=fa[q];
dep[nq]=dep[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[np]=fa[q]=nq;
for(;p&&ch[p][x]==q;p=fa[p]) ch[p][x]=nq;
}
}
}
void dfs(int x) {
int i,d=dep[x];
for(i=head[x];i;i=nxt[i]) {
int p=to[i];
dfs(p);
ans1[d]+=1ll*siz[x]*siz[p];
if(minn[x]<inf&&minn[p]<inf) ans2[d]=max(ans2[d],max(1ll*maxn[x]*maxn[p],1ll*minn[x]*minn[p]));
maxn[x]=max(maxn[x],maxn[p]);
minn[x]=min(minn[x],minn[p]);
siz[x]+=siz[to[i]];
}
}
int main() {
scanf("%d%s",&n,w+1);
int i;
for(i=1;i<=n;i++) scanf("%d",&val[i]);
memset(minn,0x3f,sizeof(minn)); memset(maxn,0x80,sizeof(maxn));
memset(ans2,0x80,sizeof(ans2));
for(i=n;i;i--) insert(w[i]-'a'),minn[lst]=maxn[lst]=val[i],siz[lst]++;
for(i=2;i<=cnt;i++) add(fa[i],i);
dfs(1);
for(i=n-2;i>=0;i--) ans1[i]+=ans1[i+1],ans2[i]=max(ans2[i],ans2[i+1]);
for(i=0;i<n;i++) {
if(ans1[i]) printf("%lld %lld\n",ans1[i],ans2[i]);
else puts("0 0");
}
}
BZOJ_4199_[Noi2015]品酒大会_后缀自动机的更多相关文章
- [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp
品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...
- 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈
P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...
- bzoj4199: [Noi2015]品酒大会(后缀数组)
题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...
- BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】
题目 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎手"两个奖项,吸 ...
- 4199. [NOI2015]品酒大会【后缀数组+并查集】
Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加.在大会的晚餐上,调酒师 ...
- [NOI2015]品酒大会(后缀树+DP)
后缀自动机有一个性质. 就是如果倒建SAM两个串的lcp就是这两个串的结束节点的LCA. 然后就可以愉快的跑DP了. 对于每一个后缀树上的节点\(u\),它对\(len[u]\)的贡献是\(\sum_ ...
- [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)
Time Limit: 10 Sec Memory Limit: 512 MB Description Input Output Sample Input 10 ponoiiipoi 2 1 4 7 ...
- BZOJ 4199 [Noi2015]品酒大会:后缀数组 + 并查集
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4199 题意: 给你一个长度为n的字符串s,和一个长为n的数组v. 对于每个整数r∈[0,n ...
- BZOJ4199 NOI2015品酒大会(后缀树)
利用SAM建出后缀树,树上每个节点计算一下|right|.right集合中ai的最大.次大.最小.次小值即可. #include<iostream> #include<cstdio& ...
随机推荐
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第九题:地宫取宝(12') [ dp ]
历届试题 地宫取宝 时间限制:1.0s 内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件 ...
- C语言基本概念之表达式
原文地址:http://blog.csdn.net/astrotycoon/article/details/50857326 [侵删] 什么是表达式(表达式的定义)? 对于表达式的定义,好像从来没有人 ...
- 给Ubuntu更换成163的源(sources.list)Unable to locate package
Refer to http://www.crifan.com/ubuntu_change_sources_list_to_163/ 1. backup /etc/apt/sources.list 2. ...
- virtualBox下Centos系统扩展磁盘空间
(1)查看空间容量: 打开windows命令终端.然后打开virtualbox安装目录,找到VBoxManage.exe,拖动到终端里面.输入命令:list hdds,回车. 我安装的位置是 : C: ...
- POJ 2348 Euclid's Game【博弈】
题目链接: http://poj.org/problem?id=2348 题意: 给定两个数,两个人每次从较大数中减去较小数的倍数,谁先得到0谁获胜,为谁赢? 分析: 令一种可能出现的整数对为(a,b ...
- 用WCF服务来动态的获取本地XML省市区文档
建立一个WCF服务. using ClassLibrary; using System; using System.Collections.Generic; using System.Linq; us ...
- Spring Data JPA 入门篇
Spring Data JPA是什么 它是Spring基于ORM框架(如hibernate,Mybatis等).JPA规范(Java Persistence API)封装的一套 JPA应用框架,可使开 ...
- Android点击Button水波纹效果
先上图,看看接下来我要向大家介绍的是个什么东西,例如以下图: 接下来要介绍的就是怎样实现上述图中的波纹效果.这样的效果假设大家没有体验过的话,能够看看百度手机卫士或者360手机卫士,里面的按钮点击效果 ...
- 深入浅出AOP(一)
动态代理实现AOP: AOP事实上非常早之前依照做出来了一些东西,之所以不敢说做出来了.是由于它是什么?怎么实现?做出来的东西是不是?先前一直查资料.查到的资料跟着做.到后来发现,AOP越来越大,而非 ...
- LoadRunner中存储表格参数------关联数组
主要用到 web_reg_save_param_ex函数("Scope=All",), sprintf( CProdNo,"{CProdNo_%d}",i ); ...