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. 新的旅程:NodeJS - 环境篇

    用ASP.NET MVC好多年了,还记得当初为MVC所倡导的"DRY"理念所感染,为Razor的简单而震撼.随着MVC的成熟反而让我觉得似乎渐渐地走入了微软营造的一种高技术的牢笼. ...

  2. spring cloud资料汇总

    https://www.cnblogs.com/Java3y/p/9540386.html#commentform --非常好的文章,里面还有海量学习资料

  3. linux之grep 基础

    第一章 -a    将binary文件以text文件的方式搜寻数据-c    只输出匹配行的计数,计算找到匹配的次数-I(大写i)    不区分大小写(只适合用于单字符)-h    查询多文件时不显示 ...

  4. 【OpenCV学习笔记之一】图像加载,修改及保存

    加载图像(用cv::imread)imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称第二个参数 表示加载的图像是什么类型 支持常见的三个参数值IMREAD_UNCHANG ...

  5. Istio 流量治理功能原理与实战

    一.负载均衡算法原理与实战 负载均衡算法(load balancing algorithm),定义了几种基本的流量分发方式,在Istio中共有4种标准负载均衡算法. •Round_Robin: 轮询算 ...

  6. yocto-sumo源码解析(二): oe-buildenv-internal

    1 首先,脚本先对运行方式进行了检测: if ! $(return >/dev/null 2>&1) ; then echo 'oe-buildenv-internal: erro ...

  7. A1043 Is It a Binary Search Tree (25 分)

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  8. 本科毕业平均年薪 30 万!经济寒冬挡不住 AI 人才的火热!

    互联网行业遭遇寒冬,企业纷纷裁员缩招,而 BAT 和硅谷明星公司对 AI 人才的投入却并不见放缓.为争夺相关人才,给应届毕业生开出的平均年薪高达 30 万. 而 TensorFlow 作为当下最流行的 ...

  9. Vigenere加密

    Vigenere加密法原理很简单,实现起来也不难.与普通的单码加密法不同,明文经过加密之后,每个字母出现的频率就不会有高峰和低峰. 密钥中字母代表行和明文中的字母代表行.在vigenere表中找到对应 ...

  10. beta 圆桌 6

    031602111 傅海涛 1.今天进展 接口微调修正 2.存在问题 文档转化太久 3.明天安排 完成全部接口的交互 4.心得体会 文档转化需要好好优化 031602115 黄家雄 1.界面优化 2. ...