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 ...
随机推荐
- 对NP问题的一点感想
一.概述 回忆欧拉回路问题,要求找出一条经过图的每条边恰好一次的路径,这个问题是线性可解的.哈密尔顿圈问题是找一个简单圈,该圈包括图的每一个顶点.对于这个问题,现在还没有发现线性算法. 对于有向图的单 ...
- nodejs安装及npm模块插件安装路径配置
在学习完js后,我们就要进入nodejs的学习,因此就必须配置nodejs和npm的属性了. 我相信,个别人在安装时会遇到这样那样的问题,看着同学都已装好,难免会焦虑起来.于是就开始上网查找解决方案, ...
- java算法面试题
前言:线上面试题与大家分享,并记录求职道路的酸甜苦辣,特此留念. 李雷和韩梅梅坐前后排,上课想说话怕被老师发现,所以改为传小纸条.为了不被老师发现他们纸条上说的是啥,他们约定了如下方法传递信息:将26 ...
- web前端开发分享-css,js入门篇
学习没有捷径,但学习是有技巧与方法. 一,css入门篇: 推荐书籍:css哪些事儿,精通css. 理由:css那些事儿,他是一本介绍css基础类的书,是入门的经典读物. 系统的介绍了css的选 ...
- 《实时控制软件设计》之Github提交作业步骤
在掌握GIT/GITHUB基本操作后,接下来把第一次的编程作业提交到 https://github.com/RTCSD15/HOMEWORK1 ,把第二次的编程作业提交到https://github. ...
- ajax异步导致js方法顺序执行不了
js两个方法调用的顺序,有时候是这样的 f1(); f2(); 本来是先执行f1的,但是如果f1里面进行ajax异步 async:true,那么可能会先执行f2,如果想要顺序执行,那么就把异步设 ...
- ns3的输入输出奥秘(二) 命令行参数
命令行参数 (1) UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9); echoClient.SetAttribute (&q ...
- 关于使用实验室服务器的GPU以及跑上TensorFlow代码
连接服务器 Windows - XShell XFtp SSH 通过SSH来连接实验室的服务器 使用SSH连接已经不陌生了 github和OS课设都经常使用 目前使用 192.168.7.169 使用 ...
- [转帖知乎]5G 网络和 4G 网络有什么区别?
5G 网络和 4G 网络有什么区别? 先放上一篇有史以来最强的5G科普: 一个简单且神奇的公式 今天的故事,从一个公式开始讲起. 这是一个既简单又神奇的公式.说它简单,是因为它一共只有3个字母.而说它 ...
- 实体框架自定义代码优先约定(EF6以后)
仅限EF6仅向前 - 此页面中讨论的功能,API等在实体框架6中引入.如果您使用的是早期版本,则部分或全部信息不适用. 使用Code First时,您的模型是使用一组约定从您的类计算的.默认的Code ...