bzoj千题计划257:bzoj4199: [Noi2015]品酒大会
http://www.lydsy.com/JudgeOnline/problem.php?id=4199
求出后缀数组的height
从大到小枚举,合并
维护组内 元素个数,最大、次大、最小、次小
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 300001 char s[N];
int n,a[N],b[N]; int p,q=;
int v[N];
int sa[][N],rk[][N],height[N]; vector<int>V[N]; int fa[N],siz[N];
long long sum[N],mx[N];
int mx1[N],mx2[N],mi1[N],mi2[N]; int MX1,MX2,MI1,MI2; void read (int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void mul(int k,int *sa,int *rk,int *SA,int *RK)
{
for(int i=;i<=n;++i) v[rk[sa[i]]]=i;
for(int i=n;i;--i) if(sa[i]>k) SA[v[rk[sa[i]-k]]--]=sa[i]-k;
for(int i=n-k+;i<=n;++i) SA[v[rk[i]]--]=i;
for(int i=;i<=n;++i) RK[SA[i]]=RK[SA[i-]]+(rk[SA[i]]!=rk[SA[i-]]||rk[SA[i]+k]!=rk[SA[i-]+k]);
} void presa()
{
for(int i=;i<=n;++i) v[a[i]]++;
for(int i=;i<=;++i) v[i]+=v[i-];
for(int i=;i<=n;++i) sa[p][v[a[i]]--]=i;
for(int i=;i<=n;++i) rk[p][sa[p][i]]=rk[p][sa[p][i-]]+(a[sa[p][i]]!=a[sa[p][i-]]);
for(int k=;k<n;k<<=,swap(p,q))
mul(k,sa[p],rk[p],sa[q],rk[q]);
} void get_height()
{
int j;
for(int i=,k=;i<=n;++i)
{
j=sa[p][rk[p][i]-];
while(a[i+k]==a[j+k]) k++;
height[rk[p][i]]=k;
if(k) k--;
}
} int find(int i) { return fa[i]==i ? i : fa[i]=find(fa[i]); } void unionn(int x,int y,int i)
{
x=find(x);
y=find(y);
sum[i]+=1LL*siz[x]*siz[y];
siz[y]+=siz[x];
if(mx2[x]>=mx1[y])
{
mx2[y]=mx2[x];
mx1[y]=mx1[x];
}
else
{
if(mx2[x]>mx2[y]) mx2[y]=mx2[x];
if(mx1[x]>=mx1[y])
{
mx2[y]=mx1[y];
mx1[y]=mx1[x];
}
else if(mx1[x]>mx2[y]) mx2[y]=mx1[x];
}
if(mi2[x]<=mi1[y])
{
mi2[y]=mi2[x];
mi1[y]=mi1[x];
}
else
{
if(mi2[x]<mi2[y]) mi2[y]=mi2[x];
if(mi1[x]<=mi1[y])
{
mi2[y]=mi1[y];
mi1[y]=mi1[x];
}
else if(mi1[x]<mi2[y]) mi2[y]=mi1[x];
}
mx[i]=max(mx[i],max(1LL*mx1[y]*mx2[y],1LL*mi1[y]*mi2[y]));
fa[x]=y;
} void solve()
{
for(int i=;i<=n;++i)
{
fa[i]=i;
siz[i]=;
mx[i]=-1e18;
mx1[i]=b[i];
mx2[i]=-1e9;
mi1[i]=b[i];
mi2[i]=1e9;
}
for(int i=;i<=n;++i) V[height[i]].push_back(i);
int s,w;
for(int i=n;i;--i)
{
s=V[i].size();
for(int j=;j<s;++j)
{
w=V[i][j];
if(find(sa[p][w-])!=find(sa[p][w])) unionn(sa[p][w-],sa[p][w],i);
if(w<n && height[w+]>=i && find(sa[p][w])!=find(sa[p][w+])) unionn(sa[p][w+],sa[p][w],i);
}
}
for(int i=n-;i;--i)
{
sum[i]+=sum[i+];
mx[i]=max(mx[i],mx[i+]);
}
cout<<1LL*n*(n-)/<<' '<<max(1LL*MX1*MX2,1LL*MI1*MI2)<<'\n';
for(int i=;i<n;++i)
{
cout<<sum[i]<<' ';
if(!sum[i]) cout<<<<'\n';
else cout<<mx[i]<<'\n';
}
} int main()
{
scanf("%d",&n);
scanf("%s",s+);
for(int i=;i<=n;++i) a[i]=s[i]-'a'+;
MX1=MX2=-1e9;
MI1=MI2=1e9;
for(int i=;i<=n;++i)
{
read(b[i]);
if(b[i]>=MX1)
{
MX2=MX1;
MX1=b[i];
}
else if(b[i]>MX2) MX2=b[i];
if(b[i]<=MI1)
{
MI2=MI1;
MI1=b[i];
}
else if(b[i]<MI2) MI2=b[i];
}
presa();
get_height();
solve();
}
bzoj千题计划257:bzoj4199: [Noi2015]品酒大会的更多相关文章
- [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp
品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...
- [BZOJ4199][NOI2015]品酒大会
#131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项, ...
- bzoj4199: [Noi2015]品酒大会(后缀数组)
题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...
- BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】
题目 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎手"两个奖项,吸 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
随机推荐
- stl源码剖析 详细学习笔记stack queue
// // stack.cpp // 笔记 // // Created by fam on 15/3/15. // // //---------------------------15/03/1 ...
- stl源码剖析 详细学习笔记deque(2)
//---------------------------15/3/13---------------------------- self&operator++() { ++cur; if(c ...
- let和const----你所不知道的JavaScript系列(2)
let 众所周知,在ES6之前,声明变量的关键字就只有var.var 声明变量要么是全局的,要么是函数级的,而无法是块级的. var a=1; console.log(a); console.log( ...
- ERP条码解决方案,金蝶盘点机条码解决方案,应用PDA的信息化管理能给我们的生产管理带来怎么样的变化的探讨
ERP条码解决方案,金蝶盘点机条码解决方案,应用PDA的信息化管理能给我们的生产管理带来怎么样的变化的探讨. 当前越来越多的大大小小的中国企业已经接受了ERP的思想,大多数的商店,企业,工厂都会上一套 ...
- M2 Daily SCRUM要求
每个人的工作 (有work item 的ID):昨天已完成的工作,今天计划完成的工作:工作中遇到的困难. 燃尽图 照片 每人的代码/文档签入记录(不能每天都在 “研讨”, 但是没有代码签入) 如实报告 ...
- 11.4 Daily Scrum
今天依旧是学习阶段,大家继续学习安卓的一些相关内容,并尝试将要用到的数据的API应用到程序中去. Today's tasks Tomorrow's tasks 丁辛 餐厅列表json/xml数据 ...
- RYU 的选择以及安装
RYU 的选择以及安装 由于近期的项目需求,不得已得了解一下控制器内部发现拓扑原理,由于某某应用中的控制器介绍中使用的RYU,所以打算把RYU装一下试试.出乎意料的是,RYU竟是我之前装过最最轻便的控 ...
- Beta 冲刺 五
团队成员 051601135 岳冠宇 031602629 刘意晗 031602248 郑智文 031602330 苏芳锃 031602234 王淇 照片 项目进展 岳冠宇 昨天的困难 数据交换比较复杂 ...
- 11th 5个新的问题——关于软件工程
5个新的问题: 1.现在课上,我们每一个团队开发一个软件,遵循的是敏捷流程,近乎每天都召开Scrum会议,但这一切都基于团队人数很少,这样我们可以畅所欲言,而且不会花费过长时间,但是,如果是大团队呢? ...
- RocketMQ 事务消息
RocketMQ 事务消息在实现上充分利用了 RocketMQ 本身机制,在实现零依赖的基础上,同样实现了高性能.可扩展.全异步等一系列特性. 在具体实现上,RocketMQ 通过使用 Half To ...