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

在大会的晚餐上,调酒师 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. 开源ITIL管理软件iTop 2.5-2.6安装

    环境说明 : 操作系统centos 7.itop版本 iTop-2.5.0-3935.数据库:mariadb iTop 2.5只支持PHP5.6以上版本,本例安装的是php72w版本 1.下载链接: ...

  2. java按照字节切割字符串,解决汉字的问题

    编写一个截取字符串的函数,输入为一个字符串,截取开始地址,截取字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个, 如“我ABC”,0,4,应该截为“我AB”,输入“我ABC汉DEF”,1, ...

  3. Mysql Order By注入总结

    何为order by 注入 本文讨论的内容指可控制的位置在order by子句后,如下order参数可控"select * from goods order by $_GET['order' ...

  4. bootstrape3 模态

    version 2 的模态 不能在 version 3 上面用. http://schy-hqh.iteye.com/blog/1995690

  5. [shell] 脚本之shift和getopts (转载)

    转载地址:http://www.361way.com/shell-shift-getopts/4973.html 建议不熟悉getopts的朋友,此篇要看完,getopts部分内容在原作者上面有改动. ...

  6. 作业 20181127-3 互评Beta版本

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2448 组名:可以低头,但没必要 组长:付佳 组员:张俊余 李文涛 孙赛佳 ...

  7. 我的寒假C(C++)学习计划

    前言 要补缺加强C语言的想法由来已久,上学期因为种种原因,某些知识点学习得不是很理想,而且,许多地方也有加强的必要,所以这次布置的随笔可谓是来得恰到好处. 学习材料 C Primer Plus 师爷的 ...

  8. 手机连接wifi 访问本地服务器网站

    手机连本地wifi后访问 http://192.168.155.1:8001/loc 版权声明:本文为博主原创文章,未经博主允许不得转载.

  9. Java网络编程二:Socket详解

    Socket又称套接字,是连接运行在网络上两个程序间的双向通讯的端点. 一.使用Socket进行网络通信的过程 服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接 ...

  10. 使用 oracle pipelined 返回一个结果集;

    1.使用 create or replace package refcursor_pkg is -- Author : mr.yang -- Created : 5/14/2017 5:13:42 P ...