UOJ131 [NOI2015] 品酒大会
考前挣扎(bu shi
之前留下来的坑
首先注意到 SAM的parent树 是反串的后缀树 也就是原串的前缀树
这个性质很重要 所以说我们在树上统计的时候两个点的lca就是两个后缀串的lcp 于是可以替代后缀数组(嘿嘿嘿
然后嘞我们树形dp 统计的size就是以这个串为前缀的子串个数
然后我们通过差分【最后后缀和 来进行统计对数
树形dp维护mn mx来进行查询最大 【有负所以要维护mn
这个最后还是要后缀max 但小心别把零转移过来
然后写写写 洛谷就过掉了
UOJ的hack数据真的吼2333
初始化的时候别忘了把0也清掉~
//Love and Freedom.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define mxn 1200000
#define inf 2002122500
#define ll long long
using namespace std;
struct node
{
int len,ch[26],fa,val,sz;
}t[mxn];
int lt,poi,rt;
struct edge{int to,lt;}e[mxn];
int in[mxn],cnt,a[mxn];
void add(int x,int y)
{
e[++cnt].to=y; e[cnt].lt=in[x]; in[x]=cnt;
}
void insert(int c,int v)
{
int p = lt, np = lt = ++poi; t[np].len = t[p].len+1; t[np].val = v; t[np].sz = 1;
for(;p && !t[p].ch[c]; p = t[p].fa) t[p].ch[c] = np;
if(!p){t[np].fa = rt; return;}
int q = t[p].ch[c];
if(t[q].len == t[p].len+1){t[np].fa = q;return;}
int nq = ++poi; t[nq].len = t[p].len+1;
memcpy(t[nq].ch,t[q].ch,sizeof(t[nq].ch));
t[nq].fa = t[q].fa; t[q].fa = t[np].fa = nq;
for(;p && t[p].ch[c] == q; p = t[p].fa) t[p].ch[c] = nq;
}
void build()
{
for(int i=2;i<=poi;i++) add(t[i].fa,i);
}
int mx[mxn],mn[mxn],sz[mxn],val[mxn];ll ans1[mxn],ans2[mxn];
void dfs(int x)
{
sz[x] = t[x].sz; val[x] = t[x].val;
if(sz[x]) mx[x] = mn[x] = val[x];
else mx[x] = -inf,mn[x] = inf;
for(int i=in[x];i;i=e[i].lt)
{
int y = e[i].to;
dfs(y);
if(mn[x]!=inf && mn[y]!=inf)
ans1[t[x].len] = max(ans1[t[x].len],max((ll)mn[x]*mn[y],(ll)mx[x]*mx[y]));
ans2[t[x].len] += (ll)sz[x]*sz[y];
sz[x] += sz[y];
mx[x] = max(mx[x],mx[y]);
mn[x] = min(mn[x],mn[y]);
}
}
char ch[mxn];
int main()
{
int n;
scanf("%d",&n);
scanf("%s",ch+1);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
rt = lt = poi = 1;
for(int i=n;i;i--)
insert(ch[i]-'a',a[i]),ans1[i] = -(ll)inf*inf;
ans1[0] = -(ll)inf*inf;
build();
dfs(rt);
for(int i=n;~i;i--)
{
ans2[i] += ans2[i+1];
if(ans2[i+1])
ans1[i] = max(ans1[i],ans1[i+1]);
}
for(int i=0;i<n;i++)
{
if(!ans2[i]) printf("%d %d\n",0,0);
else printf("%lld %lld\n",ans2[i],ans1[i]);
}
return 0;
}
UOJ131 [NOI2015] 品酒大会的更多相关文章
- BZOJ4199/UOJ131 [Noi2015]品酒大会
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- 洛谷 P2178 [NOI2015]品酒大会 解题报告
P2178 [NOI2015]品酒大会 题目描述 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发"首席品酒家"和 ...
- 【BZOJ4199】[Noi2015]品酒大会 后缀数组+并查集
[BZOJ4199][Noi2015]品酒大会 题面:http://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=2144 题解:听说能用SAM?SA默默 ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- BZOJ_4199_[Noi2015]品酒大会_后缀自动机
BZOJ_4199_[Noi2015]品酒大会_后缀自动机 Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席 ...
- [NOI2015]品酒大会(SA数组)
[NOI2015]品酒大会 题目描述 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发"首席品酒家"和" ...
- 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈
P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...
随机推荐
- [CSP-S模拟测试]:走格子(模拟+BFS+Dijkstra)
题目描述 $CYJ$想找到他的小伙伴$FPJ$,$CYJ$和$FPJ$现在位于一个房间里,这个房间的布置可以看成一个$N$行$M$列的矩阵,矩阵内的每一个元素会是下列情况中的一种:$1.$障碍区域—这 ...
- BF语言学习
Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的.由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF.这 ...
- innobackupex对MySQL做热备份,报错mysql库下数据字典表损坏
[root@node1 op]#mysql -Vmysql Ver 14.14 Distrib 5.6.29innobackupex热备份MySQL报错,报错信息:[root@node1 op]#in ...
- windowns环境下mysql 安装教程
windowns环境下mysql 安装教程 一:这里以绿色版安装为例(解压就可以使用) 下载地址: 下载页面:https://dev.mysql.com/downloads/mysql/ 2:点击 ...
- algorithm_action
求矩阵Amk.Bkn的乘积 for(i=1;i<=m;i++) for(j=1;j<=n;j++) cij = 0 for(p=1;p<=k;p++) cij += aip*bpj
- 用Delphi从内存流中判断图片格式[转]
http://blog.163.com/tfn2008%40yeah/blog/static/110321319201222243214337/ 用Delphi从内存流中判断图片格式[转] 2012- ...
- ES6中set的用法回顾
ES6中的set类似一个数组,但是其中的值都是唯一的,Set本身是一个构造函数,用来生成 Set 数据结构. set函数可以接受一个数组作为参数,用来初始化: const set = new Set( ...
- Vagrant 入门 - 清理(teardown)
原文地址 我们现在有一个功能齐全的虚拟机,可以用于基本 Web 开发.但如果现在需要更换设备,或者在另一个项目上工作,如何清理我们的开发环境? 借助 Vagrant,可以暂停(suspend),停止( ...
- SQL常用语句之数据库的创建、删除以及属性的修改-篇幅1
本篇文章主要总结了SQL Server 语句的使用和一些基础知识,因为目前我也正在学习,所以总结一下. 要使用数据库语句,首先就要知道数据库对象的结构: 通常情况下,如果不会引起混淆,可以直接使用对象 ...
- jq 与原生js 方法互相转换
最近在用mui写页面,当然了在移动App里引入jq或zepto这些框架,肯定是极不理性的.虽然jq很简单,但是也有兼容问题,js基础是很重要的,jq的成功当时是因为ie6.7.8.9.10.chrom ...