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& ...
随机推荐
- 什么样的经历,才能领悟成为架构师? >>>
什么样的经历,才能领悟成为架构师? >>> 本文主要分析 SpringBoot 的启动过程. SpringBoot的版本为:2.1.0 release,最新版本. 一.时序图 还是老 ...
- [luoguP1227] [JSOI2008]完美的对称(sort)
传送门 排序! #include <cstdio> #include <iostream> #include <algorithm> #define N 20001 ...
- 显示倒计时的Button按钮
package com.pingyijinren.helloworld.activity; import android.os.CountDownTimer; import android.suppo ...
- poj2689素数问题
打算重新刷一下数论题,忘了很多了,水平也很差,此题入手就不顺了,刷了一个早上,只是一个简单 的素数应用罢了.题意:找出区间长度不超过10^6的最近的素数和最远的素数(相邻的), 算法:数在int范围内 ...
- CDI Services *Decoretions *Intercepters * Scope * EL\(Sp EL) *Eventmodel
1.Decorators装饰器综述 拦截器是一种强大的方法在应用程序捕捉运行方法和解耦.拦截器可以拦截任何java类型的调用. 这使得拦截器适合解决事务管理,安全性,以及日记记录. 本质上说,拦截 ...
- js中的自定义异常处理函数
1. Can I suppress JavaScript error messages? 2. Can I set up my own JavaScript error handler? 3. Can ...
- WEKA简单介绍与资源汇总
简单介绍 Weka是一个开源的数据挖掘软件,里面集成了很多经典的机器学习算法,在高校和科研机构中受到了广泛的应用. 具体的简单介绍和简单的使用请參考文档:<使用Weka进行数据挖掘>. 学 ...
- PAT-PAT (Advanced Level) Practise 1001. A+B Format (20) 【二星级】
题目链接:http://www.patest.cn/contests/pat-a-practise/1001 题面: 1001. A+B Format (20) Calculate a + b and ...
- 迅雷CTO李金波:致创业者的一封信
我的创业感悟:写给正在寻找机会的你 李金波 我在迅雷的6年里,经历了许多困难.最折磨人的,是寻找人才:最惋惜的,莫过于看着优秀的人擦肩而过.今天再次创业(http://myhada.com),再次招聘 ...
- php 文件压缩zip扩展
<?php function addFileToZip($path, $zip) { $handler = opendir($path); //打开当前文件夹由$path指定. while (( ...