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 ...
随机推荐
- 架构师修炼 II - 表达思维与驾驭方法论
开篇之前我想先说说当年开发的那点事儿:大约10年前吧,我还是一个程序员的时候经常都是遇到这样的项目开发流程: 解决方案 :满足客户目的和投标用的一堆文档(不少还是互联网上抄的) ,是以Word为主的纯 ...
- centos 7 tomcat 开机自启
第一章 1.将tomcat加入开启自己,以减少手动启动的麻烦 环境配置需要提前配置好.(我这里已经是不做操作了) 192.168.1.195 jdk1.8 + tomcat 8 第二章 2.编写to ...
- MOSFET简介以及PMOS和NMOS的差异
最近在工作中,一直在调试关于MOSFET的电路.在设计过程中发现了PMOS和NMOS的差异,在此记录. 一. MOSFET简介 MOSFET (metal-oxide-semiconductor fi ...
- GitHub 新手教程 一,GitHub 注册
1,注册地址: https://github.com/ 2,输入账号.邮箱.密码: 3,选择 Free 免费账号: 4,选择一些基本信息(翻译后中文见下面的图): 翻译如下: 5,打开你注册用的邮箱, ...
- openssl证书及配置
我的环境是:Linux+Apache+MySQL+PHP 1.下载openssl 及相关依赖 #yum install -y openssl 2.进入目录 /etc/pki/tls/certs #cd ...
- 【Alpha】第八次Scrum meeting
今日任务一览: 姓名 今日完成任务 所耗时间 刘乾 学习js并学会使用js读写xml文件.学习python读取xml的方式... 然后上午满课,下午从1点到10点当计组助教去沙河教了一下午+一晚上,所 ...
- linux内核分析第五周学习笔记
linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- 在 Ubuntu16.04 中搭建 Spark 单机开发环境 (JDK + Scala + Spark)
1.准备 本文主要讲述如何在Ubuntu 16.04 中搭建 Spark 2.11 单机开发环境,主要分为 3 部分:JDK 安装,Scala 安装和 Spark 安装. JDK 1.8:jdk-8u ...
- wia驱动扫描仪
.net wia驱动扫描仪 通过各种途径,将当前比较流行的驱动扫描仪封装成了一个简单实用的class,调用扫描仪时,只需要重新创建个对象即可,代码如下: using System;using Syst ...
- ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三)
ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (三)配置远程桌面连接访问dock ...