一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。

在大会的晚餐上,调酒师 Rainbow 调制了 nn 杯鸡尾酒。这 nn 杯鸡尾酒排成一行,其中第 ii 杯酒 (1≤i≤n1≤i≤n) 被贴上了一个标签 sisi,每个标签都是 2626 个小写英文字母之一。设 Str(l,r)Str(l,r) 表示第 ll 杯酒到第 rr 杯酒的 r−l+1r−l+1 个标签顺次连接构成的字符串。若 Str(p,po)=Str(q,qo)Str(p,po)=Str(q,qo),其中 1≤p≤po≤n1≤p≤po≤n,1≤q≤qo≤n1≤q≤qo≤n,p≠qp≠q,po−p+1=qo−q+1=rpo−p+1=qo−q+1=r,则称第 pp 杯酒与第 qq 杯酒是“rr相似” 的。当然两杯“rr相似” (r>1r>1)的酒同时也是“11 相似”、“22 相似”、……、“(r−1)(r−1) 相似”的。特别地,对于任意的 1≤p,q≤n1≤p,q≤n,p≠qp≠q,第 pp 杯酒和第 qq 杯酒都是“00相似”的。

在品尝环节上,品酒师 Freda 轻松地评定了每一杯酒的美味度,凭借其专业的水准和经验成功夺取了“首席品酒家”的称号,其中第 ii 杯酒 (1≤i≤n1≤i≤n) 的美味度为 aiai。现在 Rainbow 公布了挑战环节的问题:本次大会调制的鸡尾酒有一个特点,如果把第 pp 杯酒与第 qq 杯酒调兑在一起,将得到一杯美味度为 apaqapaq 的酒。现在请各位品酒师分别对于 r=0,1,2,…,n−1r=0,1,2,…,n−1,统计出有多少种方法可以选出 22 杯“rr相似”的酒,并回答选择 22 杯“rr相似”的酒调兑可以得到的美味度的最大值。

输入格式

输入文件的第 11 行包含 11 个正整数 nn,表示鸡尾酒的杯数。

第 22 行包含一个长度为 nn 的字符串 SS,其中第 ii 个字符表示第 ii 杯酒的标签。

第 33 行包含 nn 个整数,相邻整数之间用单个空格隔开,其中第 ii 个整数表示第 ii 杯酒的美味度 aiai。

输出格式

输出文件包括 nn 行。第 ii 行输出 22 个整数,中间用单个空格隔开。第 11 个整数表示选出两杯“(i−1)(i−1)相似”的酒的方案数,第 22 个整数表示选出两杯“(i−1)(i−1)相似”的酒调兑可以得到的最大美味度。若不存在两杯“(i−1)(i−1)相似”的酒,这两个数均为 00。

我们从大往小枚举lcp,这样我们需要不停的合并一些区间并且查询一个位置所在区间的左右端点,并查集显然可以胜任。

用的st表,但预处理太慢在uoj上能过但在bzoj上会T掉,啊啊啊懒得卡常了。。。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define inf 1LL<<62
#define N 300005
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int read()
{
char c=getchar();int p=,f=;
while(c<''||c>'')
{
if(c=='-')f=-;c=getchar();
}
while(c>=''&&c<='')p=p*+c-'',c=getchar();
return p*f;
}
char s[N];
int wb[N*],rank[N*],sa[N*],sum[N];
void da(int n,int m)
{
int *x=rank,*y=wb;
for(int i=;i<m;i++)sum[i]=;
for(int i=;i<n;i++)sum[x[i]=s[i]]++;
for(int i=;i<m;i++)sum[i]+=sum[i-];
for(int i=n-;i>=;i--)sa[--sum[x[i]]]=i;
int p=;
for(int j=;p<n;j<<=,m=p)
{
p=;
for(int i=n-j;i<n;i++)y[p++]=i;
for(int i=;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
for(int i=;i<m;i++)sum[i]=;
for(int i=;i<n;i++)sum[x[i]]++;
for(int i=;i<m;i++)sum[i]+=sum[i-];
for(int i=n-;i>=;i--)sa[--sum[x[y[i]]]]=y[i];
swap(x,y);x[sa[]]=;p=;
for(int i=;i<n;i++)
x[sa[i]]=y[sa[i]]==y[sa[i-]]&&y[sa[i]+j]==y[sa[i-]+j]?p-:p++;
}
return ;
}
int h[N];
void cal(int n)
{
for(int i=;i<=n;i++)rank[sa[i]]=i;
int k=;
for(int i=;i<n;i++)
{
if(k)k--;
int j=sa[rank[i]-];
while(s[i+k]==s[j+k])k++;
h[rank[i]]=k;
}
return ;
}
ll ans[N][];
int n;
int v[N];
int f[N],g[N];
int findf(int x)
{
if(f[x]==x)return x;
return f[x]=findf(f[x]);
}
int findg(int x)
{
if(g[x]==x)return x;
return g[x]=findg(g[x]);
}
struct node
{
int pos,zhi;
friend bool operator < (node aa,node bb)
{
return aa.zhi>bb.zhi;
}
}q[N];
ll mn[N*][];//
ll mx[N*][];//
int lg[N*];
void st()
{
int now=;
for(int i=;i<=n;i*=)
{
for(int j=i;j<i<<;j++)
{
lg[j]=now;
}
now++;
}
for(int i=;i<=n;i++)mn[i][]=v[sa[i]],mx[i][]=v[sa[i]];
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)
{
if(j+(<<(i-))<=n)mx[j][i]=max(mx[j][i-],mx[j+(<<(i-))][i-]);
else mx[j][i]=mx[j][i-];
if(j+(<<(i-))<=n)mn[j][i]=min(mn[j][i-],mn[j+(<<(i-))][i-]);
else mn[j][i]=mn[j][i-];
}
}
}
ll qurmx(int l,int r)
{
int k=lg[r-l+];
return max(mx[l][k],mx[r-(<<k)+][k]);
}
ll qurmn(int l,int r)
{
int k=lg[r-l+];
return min(mn[l][k],mn[r-(<<k)+][k]);
}
int main()
{
n=read();
scanf("%s",s);
ll mx1=-inf,mx2=-inf;
ll mn1=inf,mn2=inf;
for(int i=;i<n;i++)
{
v[i]=read();
if(v[i]>mx1)mx2=mx1,mx1=v[i];
else if(v[i]>mx2)mx2=v[i];
if(v[i]<mn1)mn2=mn1,mn1=v[i];
else if(v[i]<mn2)mn2=v[i];
}
da(n+,);
cal(n);st();
for(int i=;i<=n;i++)q[i].pos=i,q[i].zhi=h[i];
for(int i=;i<=n;i++)ans[i][]=-inf;
sort(q+,q+n+);
for(int i=;i<=n+;i++)f[i]=i,g[i]=i;
for(int i=;i<=n;i++)
{
if(q[i].zhi==)break;
int t=q[i].pos;
int aa=findf(t-);int bb=findg(t+);
ll q1=t-aa;ll q2=bb-t-;
ans[q[i].zhi][]+=q1*(q2+);
f[t]=aa;g[t]=bb;
ans[q[i].zhi][]=max(ans[q[i].zhi][],qurmx(aa,t-)*qurmx(t,bb-));
ans[q[i].zhi][]=max(ans[q[i].zhi][],qurmn(aa,t-)*qurmn(t,bb-)); }
for(int i=n-;i>=;i--)ans[i][]+=ans[i+][],ans[i][]=max(ans[i][],ans[i+][]);
ans[][]=(ll)n*((ll)n-)/;
ans[][]=max(mx1*mx2,mn1*mn2);
for(int i=;i<=n-;i++)
{
if(ans[i][])printf("%lld %lld\n",ans[i][],ans[i][]);
else puts("0 0");
}
return ;
}

bzoj 4199 && NOI 2015 品酒大会的更多相关文章

  1. [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会

    [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...

  2. [NOI 2015]品酒大会

    Description 题库链接 \(n\) 杯鸡尾酒排成一行,其中第 \(i\) 杯酒 (\(1 \leq i \leq n\)) 被贴上了一个标签 \(s_i\),每个标签都是 \(26\) 个小 ...

  3. 【BZOJ 4199】[Noi2015]品酒大会 后缀自动机+DP

    题意 两个长度为$r$的子串相等称为$r$相似,两个$r$相似的权值等于子串开头位置权值乘积,给定字符串和每个位置权值,求$r$相似子串数量和最大权值乘积 对反串建立后缀自动机得到后缀树,后缀树上两个 ...

  4. NOI 2015 品酒大会 (后缀数组+并查集)

    题目大意:略 40分暴力还是很好写的,差分再跑个后缀和 和 后缀最大值就行了 一种正解是后缀数组+并查集 但据说还有后缀数组+单调栈的高端操作蒟蒻的我当然不会 后缀数组求出height,然后从大到小排 ...

  5. 【BZOJ 4199】 [Noi2015]品酒大会

    [链接]h在这里写链接 [题意]     给你一个长度为n的字符串s;     标志了每一杯酒;     以及n个数字,表示每一杯酒的美味度ai.     两杯酒(i,j)称为r相似     当且仅当 ...

  6. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...

  7. BZOJ 4197 NOI 2015 寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  8. BZOJ 4197 NOI 2015 寿司晚宴

    题面 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 ...

  9. [bzoj 4196][NOI 2015]软件包管理器

    大概算是一道模板题吧? 就是细节有点多 罗列一下: 如果习惯从1开始搞树的编号的话,处理输入进来的那个依赖关系在加边的时候两个都要+1,体现在代码就是i要从2枚举到n,然后输入进来的那个数要+1 这道 ...

随机推荐

  1. bitcoin PoW原理及区块创建过程

    bitcoin PoW原理及区块创建过程 PoW 为了在点对点的基础上实现一个分布式时间戳服务器,我们需要使用PoW(Proof of Work)系统来达成共识.PoW过程就是寻找一个目标值的过程,当 ...

  2. Acer 4750G安装OS X 10.9 DP4(简版)

    一.下载os x 10.9懒人版:http://bbs.pcbeta.com/viewthread-1384504-1-1.html 二.用系统自带的磁盘分区工具划分一个5G左右的临时安装盘(新建分区 ...

  3. [linux] LVM原磁盘扩容(非增加磁盘)

    阿里云机器,ECS运行时磁盘由300G扩容到500,重启机器生效后登录.可以看到/data目录总大小300G,/dev/vdb已经扩容到500G. [root@HD1g-elasticsearch2 ...

  4. Django_rest_framework_Serializer

    序列化Serializer 序列化用于对用户请求数据进行验证和数据进行序列化(为了解决queryset序列化问题). 那什么是序列化呢?序列化就是把对象转换成字符串,反序列化就是把字符串转换成对象 m ...

  5. Vue 入门之概念

    Vue 简介 Vue 是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 [view].新的 Vue 版本参考了 React 的部分设计,当然也有自己独特的地方,比如 Vue 的单文件组 ...

  6. python判断文件和文件夹是否存在、没有则创建文件夹

    原文出处:https://www.cnblogs.com/hushaojun/p/4533241.html >>> import os >>> os.path.ex ...

  7. 忘记本地MySQL数据库密码的解决方案。

    忘记本地MySQL数据库密码,解决方案,分以下10个步骤: 参考链接:                  https://blog.csdn.net/weidong_y/article/details ...

  8. Scrum Meeting 11 -2014.11.17

    今天和其他两个小组讨论了关于整合问题,在数据库连接等具体方面上还需要继续商讨. 我们小组内部讨论了,这周还是需要在处理整合的同时做项目整体的测试与改进的. Member Today’s task Ne ...

  9. wcf的DataContractAttribute与DataMenmberAttribute

    文章:序列化和反序列化的几种方式(DataContractSerializer)(二) 介绍了序列化控制细节.哪些字段可以序列化,序列化后这些字段的名字.

  10. NET Core Mvc发布带视图文件的方法!

    添加节点:<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>