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]品酒大会的更多相关文章

  1. [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集

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

  2. [UOJ#131][BZOJ4199][NOI2015]品酒大会

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

  3. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  4. [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp

    品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...

  5. [BZOJ4199][NOI2015]品酒大会

    #131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项, ...

  6. bzoj4199: [Noi2015]品酒大会(后缀数组)

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

  7. BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】

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

  8. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  9. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

随机推荐

  1. stl源码剖析 详细学习笔记 仿函数

    //---------------------------15/04/01---------------------------- //仿函数是为了算法而诞生的,可以作为算法的一个参数,来自定义各种操 ...

  2. .netCoreMVC添加数据仓储

    在上一篇关于CodeFirst从零搭建ASP.NETCore2.0中搭建起了完整.netCoreMVC项目,在这一篇中将实现如何注册service服务和Repository数据仓储到web中实现数据的 ...

  3. python 微信撤回消息

    import itchatfrom itchat.content import *import osimport reimport time# 文件临时存储页rec_tmp_dir = os.path ...

  4. python + selenium webdriver 自动化测试 之 环境异常处理 (持续更新)

    1.webdriver版本与浏览器版本不匹配,在执行的时候会抛出如下错误提示 selenium.common.exceptions.WebDriverException: Message: unkno ...

  5. Hyperldeger Fabric踩过的坑

    给参与者颁发身份时错误 错误信息: fabric-ca request register failed with errors [[{"code":400,"messag ...

  6. [T-ARA][Ma boo]

    歌词来源:http://music.163.com/#/song?id=22704447 作曲 : 金道勋/Rhymer [作曲 : 金道勋/Rhymer] 作词 : 金道勋 [作词 : 金道勋] 사 ...

  7. 第二个spring冲刺总结

    讨论成员:罗凯旋.罗林杰.吴伟锋.黎文衷 第二阶段总体是做到了四则运算的demo,,包括APP进入动画,以及界面的基本效果设计,还有能进行综合计算(选择题,可以 自动生成简单,容易,困难 三种难度  ...

  8. python数据分析Adult-Salary预测

    具体文档戳下方网站 https://pan.wps.cn/l/s4ojed8 代码如下: import pandas as pdimport numpy as npimport matplotlib. ...

  9. Beta版本冲刺(一)

    目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...

  10. springmvc关于redisCluster的使用及配置

    首先附上maven仓库jar包的下载地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-loca ...