题目链接:品酒大会

  学了后缀自动机之后再来写这道题就轻松多了……

  首先,题面中的两杯酒\(r\)相似就是这两个后缀的最长公共前缀大于等于\(r\)。把串翻转过来之后就变成了两个前缀的最长公共后缀……然后就是\(parent\)树的事了……

  接着,我们要求出选出两杯\(r\)相似的酒的方案数。这个比较显然,就是枚举两个节点的\(lca\),然后把儿子的\(right\)集合大小 两两乘起来就可以了。

  然后就是选出两个值使得乘积最大。树型\(dp\)还是比较显然的,在\(parent\)树上记录一下每棵子树内的最大值、最小值,那么显然最大值要么就是最大值和最大值乘起来,要么就是最小值和最小值乘起来,要么就是子树内的最大值。背包一下就求出来了。由于这道题每次是更新一段前缀,于是把更新弄成点事件,\(dp\)完后再从大到小扫一遍即可。要注意负数的情况。

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 600010
#define INF (1LL<<61)
#define maxint (1<<30) using namespace std;
typedef long long llg; char s[maxn>>1];
int n,tot,la,head[maxn],next[maxn],to[maxn],tt,a[maxn],nn;
int son[maxn][26],len[maxn],fa[maxn],siz[maxn],pos[maxn];
llg ans[maxn],maxv[maxn],minv[maxn],f[maxn],c[maxn]; int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} void link(int x,int y){to[++tt]=y;next[tt]=head[x];head[x]=tt;}
void insert(int p,int x){
int np=++tot; siz[np]=1; len[np]=len[p]+1;
pos[np]=a[++nn]; f[np]=-INF;
for(;p && !son[p][x];p=fa[p]) son[p][x]=np;
if(!p) fa[np]=1;
else{
int q=son[p][x];
if(len[q]==len[p]+1) fa[np]=q;
else{
int nq=++tot;
memcpy(son[nq],son[q],sizeof(son[q]));
fa[nq]=fa[q]; fa[np]=fa[q]=nq; len[nq]=len[p]+1;
for(;son[p][x]==q;p=fa[p]) son[p][x]=nq;
}
}
la=np;
} void dfs(int u){
if(siz[u]) maxv[u]=minv[u]=pos[u];
for(int i=head[u],v;v=to[i],i;i=next[i]){
dfs(v); ans[len[u]]+=(llg)siz[u]*siz[v];
if(siz[u]) f[u]=max(f[u],max(maxv[u]*maxv[v],minv[u]*minv[v]));
maxv[u]=max(maxv[u],maxv[v]); minv[u]=min(minv[u],minv[v]);
siz[u]+=siz[v]; f[u]=max(f[u],f[v]);
}
if(siz[u]>1) c[len[u]]=max(c[len[u]],f[u]);
} int main(){
File("a");
scanf("%d",&n); scanf("%s",s+1); tot=la=1;
for(int i=1;i<=n;i++) a[n-i+1]=getint();
for(int i=n>>1;i;i--) swap(s[i],s[n-i+1]);
for(int i=1;i<=n;i++) insert(la,s[i]-'a');
for(int i=0;i<=n;i++) c[i]=-INF;
for(int i=2;i<=tot;i++) link(fa[i],i);
for(int i=1;i<=tot;i++) minv[i]=maxint,maxv[i]=-maxint,f[i]=-INF;
dfs(1);
for(int i=n-1;i>=0;i--) c[i]=max(c[i],c[i+1]),ans[i]+=ans[i+1];
for(int i=0;i<n;i++){
if(!ans[i]) c[i]=0;
printf("%lld %lld\n",ans[i],c[i]);
}
return 0;
}

UOJ #131 【NOI2015】 品酒大会的更多相关文章

  1. ●UOJ 131 [NOI2015] 品酒大会

    题链: http://uoj.ac/problem/131 题解: 网上大多数的方法都是用并查集维护.这里呢,给出另一种自己YY的解法(但实际上本质差不多吧): 后缀数组,RMQ,单调栈 1).预处理 ...

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

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

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

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

  4. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

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

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

  6. 【BZOJ4199】[Noi2015]品酒大会 后缀数组+并查集

    [BZOJ4199][Noi2015]品酒大会 题面:http://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=2144 题解:听说能用SAM?SA默默 ...

  7. BZOJ_4199_[Noi2015]品酒大会_后缀自动机

    BZOJ_4199_[Noi2015]品酒大会_后缀自动机 Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席 ...

  8. [NOI2015]品酒大会(SA数组)

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

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

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

  10. [NOI2015] 品酒大会 - 后缀数组,并查集,STL,启发式合并

    [NOI2015] 品酒大会 Description 对于每一个 \(i \in [0,n)\) 求有多少对后缀满足 LCP 长度 \(\le i\) ,并求满足条件的两个后缀权值乘积的最大值. So ...

随机推荐

  1. CentOS6.8系统安装Oracle11g

    1.官网上下载 软件安装包: linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip 解压后: 生成文件夹: datab ...

  2. vue 引入通用 css

    1.在入口 js 文件 main.js 中引入,一些公共的样式文件,可以在这里引入. import Vue from 'vue' import App from './App' // 引入App这个组 ...

  3. 判断手机访问还是pc访问

    function isMobile(){ // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) re ...

  4. java8新增的日期时间包

    Clock clock=Clock.systemUTC(); System.out.println("当前时刻为:"+clock.instant()); System.out.pr ...

  5. 阿里云服务器被挖矿程序minerd入侵的终极解决办法[转载]

    突然发现阿里云服务器CPU很高,几乎达到100%,执行 top c 一看,吓一跳,结果如下: root 386m S : /tmp/AnXqV -B -a cryptonight -o stratum ...

  6. 阿里云ecs禁止ping,禁止telnet

    现在的中小型企业服务器大多是云比较多,因此,可能会面临着服务器ping不通,或者是端口telnet不通的情况,但是服务器上的服务仍然是正常的情况,这个时候我们就要考虑是不是云上配置了访问规则了.废话不 ...

  7. expdp全库备份rac数据库因错误终止

    1.expdp导出日志报错如下: ORA-39014: One or more workers have prematurely exited. ORA-39029: worker 2 with pr ...

  8. R-CNN论文详解 - CSDN博客

    废话不多说,上车吧,少年 paper链接:Rich feature hierarchies for accurate object detection and semantic segmentatio ...

  9. mysql 约束条件 not null与default

    not null与default 是否可空,null表示空,非字符串not null - 不可空null - 可空 use db4: 默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动 ...

  10. 使用JAVA实现语音朗读一段文本

    需要做的工作: 1.下载  jacob-1.17-M2 或 jacob-1.18 2.解压jacob-1.17-M2 或 jacob-1.18 3.向工程里导入jacob.jar 4.将 jacob- ...