传送门

Description

一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品

酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。在大会的晚餐上,调酒师Rainbow调制了 n 杯鸡尾酒。

这 n 杯鸡尾酒排成一行,其中第 i 杯酒 \((1≤i≤n)\) 被贴上了一个标签 \(s_i\),每个标签都是 26 个小写英文字母

之一。设 Str(l,r) 表示第 l 杯酒到第 r 杯酒的 r-l+1 个标签顺次连接构成的字符串。若 \(Str(p,po)=Str(q,qo)\) ,其中 \(1≤p≤po≤n,1≤q≤qo≤n,p≠q,po-p+1=qo-q+1=r\) ,则称第 p 杯酒与第 q 杯酒是“ r 相似”的。当

然两杯“ r 相似”(r>1)的酒同时也是“ 1 相似”、“ 2 相似”、……、“ (r-1) 相似”的。在品尝环节上,

品酒师Freda轻松地评定了每一杯酒的美味度,凭借其专业的水准和经验成功夺取了“首席品酒家”的称号,其中

第 i 杯酒 (1≤i≤n) 的美味度为 \(a_i\) 。现在Rainbow公布了挑战环节的问题:本次大会调制的鸡尾酒有一个特点

,如果把第 p 杯酒与第 q 杯酒调兑在一起,将得到一杯美味度为 \(a_p ,a_q\) 的酒。现在请各位品酒师分别对于 \(r=0,1,2,..,n-1\) ,统计出有多少种方法可以选出 2 杯“ r 相似”的酒,并回答选择 2 杯“ r 相似”的酒调兑可以

得到的美味度的最大值。

Solution

构建出\(height\)数组,然后自上而下合并即可,因为权值有可能是负数,所以对于每个集合,需要维护一下它的最大值和最小值。

Code

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 300005
#define M(a) memset(a,0,sizeof a);
int n,l[MN],r[MN],siz[MN],fa[MN],id[MN];char s[MN];
ll m[MN],ans[MN];
int h[MN],p,q,sa[2][MN],rk[2][MN],num[MN];
inline void build_sa()
{register int i,j,k,mx;for(i=1;i<=n;++i) num[s[i]-'a'+1]++;for(i=1;i<=26;++i) num[i]+=num[i-1];for(i=1;i<=n;++i) sa[1][num[s[i]-'a'+1]--]=i;for(i=1;i<=n;++i) rk[1][sa[1][i]]=rk[1][sa[1][i-1]]+(s[sa[1][i-1]]!=s[sa[1][i]]);mx=rk[1][sa[1][n]];for(p=1,q=0,k=1;k<=n;k<<=1,p^=1,q^=1){if(mx==n) break;for(i=1;i<=n;++i) num[rk[p][sa[p][i]]]=i;for(i=n;i;--i) if(sa[p][i]>k) sa[q][num[rk[p][sa[p][i]-k]]--]=sa[p][i]-k;for(i=n-k+1;i<=n;++i) sa[q][num[rk[p][i]]--]=i;for(i=1;i<=n;++i)rk[q][sa[q][i]]=rk[q][sa[q][i-1]]+(rk[p][sa[q][i]]!=rk[p][sa[q][i-1]]||rk[p][sa[q][i]+k]!=rk[p][sa[q][i-1]+k]);mx=rk[q][sa[q][n]];}for(i=k=1;i<=n;++i){if(rk[p][i]==1) continue;if(k) k--;for(j=sa[p][rk[p][i]-1];j+k<=n&&i+k<=n&&s[i+k]==s[j+k];++k);h[i]=k;}
}
inline bool cmp(const int&o,const int&oo){return h[o]>h[oo];}
inline int getf(int x){return fa[x]==x?x:fa[x]=getf(fa[x]);}
int main()
{n=read();scanf("%s",s+1);register int i;for(i=1;i<=n;++i) l[i]=r[i]=read();for(i=1;i<=n;++i) id[i]=i,ans[i-1]=-1e18,siz[i]=1,fa[i]=i;build_sa();std::sort(id+1,id+n+1,cmp);for(i=1;i<=n;i++){int u=getf(id[i]),v=getf(sa[p][rk[p][id[i]]-1]);m[h[id[i]]]+=1ll*siz[u]*siz[v],ans[h[id[i]]]=max(ans[h[id[i]]],max(1ll*l[u]*l[v],1ll*r[u]*r[v]));r[u]=max(r[u],r[v]),l[u]=min(l[u],l[v]),siz[u]+=siz[v],fa[v]=u;}for(i=n-2;i>=0;i--) m[i]+=m[i+1],ans[i]=max(ans[i],ans[i+1]);for(i=0;i<n;i++) printf("%lld %lld\n",m[i],m[i]?ans[i]:0);return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10281044.html

[bzoj 4199][NOI 2015]品酒大会相关推荐

  1. NOI 2015 品酒大会

    #131. [NOI2015]品酒大会 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发"首席品酒家"和" ...

  2. BZOJ 4197 NOI 2015 寿司晚宴

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

  3. bzoj 4198 [ Noi 2015 ] 荷马史诗 —— 哈夫曼编码(k叉哈夫曼树)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 第一次写哈夫曼树!看了很多博客. 哈夫曼树 & 哈夫曼编码:https://w ...

  4. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)

    UOJ #131 BZOJ 4199 luogu P2178[NOI2015]品酒大会 (后缀自动机.树形DP) 水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.or ...

  5. BZOJ 4199 [Noi2015]品酒大会(后缀自动机 + parent树上统计)

    4199: [Noi2015]品酒大会 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1598  Solved: 905 [Submit][Stat ...

  6. [BZOJ4199][NOI2015]品酒大会-后缀数组

    品酒大会 题目描述 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发"首席品酒家"和"首席猎手" ...

  7. [NOI2015]品酒大会

    题目描述 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发"首席品酒家"和"首席猎手"两个奖项 ...

  8. 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈

    P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...

  9. 洛谷 P2178 [NOI2015]品酒大会 解题报告

    P2178 [NOI2015]品酒大会 题目描述 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发"首席品酒家"和 ...

最新文章

  1. php钩子函数示例,PHP中钩子函数的实现与认识
  2. 双中心单电子积分计算氢分子离子H2+的轨道能量
  3. MapStruct解决数据传输对象转换的繁琐
  4. WGho_Setup 雨林木风 一键备份
  5. spark work启动失败
  6. java log4j记录_JAVA中使用LOG4J记录日志
  7. scala:Scala class的构造方法与继承
  8. 常见面试算法:朴素贝叶斯
  9. 将Banner美观的放置于博客首页上
  10. LaTeX(Overleaf)写作笔记
  11. 【VS2017】VS2017离线安装教程
  12. C#之DotNetBar2使用方法 - itemPanel1
  13. 嵌入式、单片机之间的区别
  14. IP 地址由网络和主机两部分标识组成
  15. How to debug Windows bugcheck 0x9F, parameter 3
  16. 多功能聊天室 第一次迭代总结与第二次迭代计划
  17. 使用 kubectl drain 从集群中移除节点
  18. SEC官员:ICO指南即将发布
  19. Android平板如何玩windows,高手教你如何使用安卓平板远程控制PC电脑
  20. Shamir 秘密共享方案和Feldman可验证的秘密共享方案

热门文章

  1. 批量启用lync用户-3
  2. **汇总CodeIgniter(CI)的数据库操作函数
  3. c++ - Create empty json array with jsoncpp - Stack Overflow
  4. [一个小问题]Mainfest配置文件的version问题小结
  5. Squid access.log 转发到其他syslog服务器(OSSIM)
  6. 【刷算法】判断链表是否有环以及返回入环节点
  7. 线程中消费者生产者的实例代码(使用Lock类)
  8. IoT机会窗打开:运营商亟需战略转型 获取物联网最大化价值
  9. 常用的Meta标签写法和作用
  10. 2014年百度之星程序设计大赛 - 初赛(第二轮)Chess