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

在大会的晚餐上,调酒师 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。

样例一

input

10
ponoiiipoi
2 1 4 7 4 8 3 6 4 7

output

45 56
10 56
3 32
0 0
0 0
0 0
0 0
0 0
0 0
0 0

explanation

用二元组 (p,q)(p,q) 表示第 pp 杯酒与第 qq 杯酒。

00 相似:所有 4545 对二元组都是 00 相似的,美味度最大的是 8×7=568×7=56。

11 相似:(1,8)(1,8) (2,4)(2,4) (2,9)(2,9) (4,9)(4,9) (5,6)(5,6) (5,7)(5,7) (5,10)(5,10) (6,7)(6,7) (6,10)(6,10) (7,10)(7,10),最大的 8×7=568×7=56。

22 相似:(1,8)(1,8) (4,9)(4,9) (5,6)(5,6),最大的 4×8=324×8=32。

没有 3,4,5,…,93,4,5,…,9 相似的两杯酒,故均输出 00。

样例二

input

12
abaabaabaaba
1 -2 3 -4 5 -6 7 -8 9 -10 11 -12

output

66 120
34 120
15 55
12 40
9 27
7 16
5 7
3 -4
2 -4
1 -4
0 0
0 0

样例三

见样例数据下载。

限制与约定

测试点编号 nn 的规模 aiai 的规模 备注
1 n=100n=100 ∣ai∣≤10000∣ai∣≤10000  
2 n=200n=200
3 n=500n=500
4 n=750n=750
5 n=1000n=1000 ∣ai∣≤1000000000∣ai∣≤1000000000
6
7 n=2000n=2000
8
9 n=99991n=99991 ∣ai∣≤1000000000∣ai∣≤1000000000 不存在“1010相似”的酒
10
11 n=100000n=100000 ∣ai∣≤1000000∣ai∣≤1000000 所有 aiai 的值都相等
12 n=200000n=200000
13 n=300000n=300000
14
15 n=100000n=100000 ∣ai∣≤1000000000∣ai∣≤1000000000  
16
17 n=200000n=200000
18
19 n=300000n=300000
20
/*
后缀数组+启发式合并
求出height数组后,从大到小进行合并,在合并的过程中进行计算。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 300010
#define inf 1000000000000000000LL
using namespace std;
int s[N],a[N],t1[N],t2[N],c[N],sa[N],rank[N],height[N],n;
int mx[N],mn[N],size[N],fa[N],next[N];
long long ans[][N];
char ch[N];
bool cmp(int *y,int a,int b,int k){
int a1=y[a],b1=y[b];
int a2=a+k<=n?y[a+k]:-;
int b2=b+k<=n?y[b+k]:-;
return a1==b1&&a2==b2;
}
void DA(){
int *x=t1,*y=t2,m=;
for(int i=;i<=m;i++) c[i]=;
for(int i=;i<=n;i++) c[x[i]=s[i]]++;
for(int i=;i<=m;i++) c[i]+=c[i-];
for(int i=n;i;i--) sa[c[x[i]]--]=i;
for(int k=,p=;k<=n;k*=,m=p,p=){
for(int i=n-k+;i<=n;i++) y[++p]=i;
for(int i=;i<=n;i++) if(sa[i]>k) y[++p]=sa[i]-k;
for(int i=;i<=m;i++) c[i]=;
for(int i=;i<=n;i++) c[x[y[i]]]++;
for(int i=;i<=m;i++) c[i]+=c[i-];
for(int i=n;i;i--) sa[c[x[y[i]]]--]=y[i];
swap(x,y);p=;x[sa[]]=;
for(int i=;i<=n;i++)
if(cmp(y,sa[i-],sa[i],k)) x[sa[i]]=p;
else x[sa[i]]=++p;
if(p>=n) break;
}
}
void geth(){
for(int i=;i<=n;i++) rank[sa[i]]=i;
for(int i=,j=;i<=n;i++){
if(rank[i]==) continue;
while(s[i+j]==s[sa[rank[i]-]+j]) j++;
height[rank[i]]=j;
if(j) j--;
}
}
bool px(int x,int y){
if(height[x]==height[y]) return x<y;
return height[x]>height[y];
}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
mx[x]=max(mx[x],mx[y]);
mn[x]=min(mn[x],mn[y]);
size[x]+=size[y];
fa[y]=x;
}
int main(){
scanf("%d%s",&n,ch);
for(int i=;i<=n;i++){
s[i]=ch[i-]-'a'+;
scanf("%d",&a[i]);
}
DA();geth();int num=n;
for(int i=;i<=n;i++){
fa[i]=i;
size[i]=;
mx[i]=mn[i]=a[sa[i]];
next[i]=i+;
ans[][i]=-inf;
}
ans[][]=-inf;
sort(next+,next+n,px);
for(int i=;i<n;i++){
int x=find(next[i]-),y=find(next[i]);
ans[][height[next[i]]]+=1LL*size[x]*size[y];
ans[][height[next[i]]]=max(ans[][height[next[i]]],1LL*mx[x]*mx[y]);
ans[][height[next[i]]]=max(ans[][height[next[i]]],1LL*mx[x]*mn[y]);
ans[][height[next[i]]]=max(ans[][height[next[i]]],1LL*mn[x]*mx[y]);
ans[][height[next[i]]]=max(ans[][height[next[i]]],1LL*mn[x]*mn[y]);
merge(x,y);
}
for(int i=n-;~i;i--) ans[][i]+=ans[][i+],ans[][i]=max(ans[][i],ans[][i+]);
for(int i=;i<n;i++) printf("%I64d %I64d\n",ans[][i],ans[][i]?ans[][i]:);
return ;
}

 

最新文章

  1. Mac下配置Apache + Php + Mysql环境
  2. 树莓派实现远程开机局域网电脑(WOL协议+etherwake+华硕主板Z97)秒变花生壳开机棒
  3. 纯CSS实现tooltip提示框,CSS箭头及形状之续篇--给整个tooltip提示框加个边框
  4. Ubuntu 环境 运行Asp.net mvc +EntityFramework+ Mysql
  5. printf在终端输出时改变颜色
  6. CF135A Replacement
  7. CODEVS 3285 转圈游戏
  8. SCNU省选校赛第二场B题题解
  9. shell脚本—根据文件个数定时备份
  10. java 输入、输出流
  11. 3377: [Usaco2004 Open]The Cow Lineup 奶牛序列
  12. Hadoop之HDFS原理及文件上传下载源码分析(下)
  13. Lucene 源码分析之倒排索引(三)
  14. No enclosing instance of type Test is accessible. Must qualify the allocation with an enclosing instance of type Test (e.g. x.new A() where x is an instance of Test).
  15. sql 查询结果自定义排序
  16. 【BZOJ4408】[FJOI2016]神秘数(主席树)
  17. 期货大赛项目|三,autofac简单用法
  18. LeetCode 412 Fizz Buzz 解题报告
  19. 微信公众号H5支付步骤
  20. 【硬件】- 英特尔CPU命名中的产品线后缀

热门文章

  1. 51nod——2476 小b和序列(预处理 思维)
  2. python 使用uuid 出现重复
  3. 十八、MySQL 排序
  4. centos7安装mongodb3.6
  5. 【CodeBase】PHP检查未知媒体文件的格式
  6. Redis之Hash类型操作
  7. KMP的正确使用法_x新疆网络赛Query on a string
  8. [原]sencha touch之布局
  9. Python及其常用模块库下载及安装
  10. “帮你APP”团队冲刺5