[BZOJ4199][Noi2015]品酒大会 树形DP+后缀自动机
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 1200000
using namespace std;
struct edge {
int to,next;
}e[maxn];
int n,a[maxn];
char s[maxn];
int head[maxn],d;
long long ans[maxn],mx[maxn],mn[maxn],sum[maxn];
struct data {
int last,cnt;
int son[maxn][],link[maxn],step[maxn],v[maxn],size[maxn];
int tmp[maxn];
data() {last=cnt=;v[]=;}
void extend(int c,int val) {
int p=last,np=last=++cnt;step[np]=step[p]+;v[np]=val,size[np]=;
while(p&&!son[p][c]) son[p][c]=np,p=link[p];
if(!p) link[np]=;
else {
int q=son[p][c];
if(step[q]==step[p]+) link[np]=q;
else {
int nq=++cnt;v[nq]=;
memcpy(son[nq],son[q],sizeof(son[q]));
link[nq]=link[q];
link[q]=link[np]=nq;
step[nq]=step[p]+;
while(son[p][c]==q&&p) son[p][c]=nq,p=link[p];
}
}
}
void add(int u,int v) {e[d].next=head[u];e[d].to=v;head[u]=d++;}
void build() {for(int i=;i<=cnt;i++) add(link[i],i),ans[i]=-21474836470000000000000LL;}
void query(int x) {
mx[x]=-;mn[x]=;
if(v[x]!=) mx[x]=mn[x]=v[x];
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;
query(to);
if(mx[x]!=-&&mn[x]!=&&mx[to]!=-&&mn[to]!=) ans[step[x]]=max(ans[step[x]],max(mx[x]*mx[to],mn[to]*mn[x]));
mx[x]=max(mx[x],mx[to]);mn[x]=min(mn[x],mn[to]);
sum[step[x]]+=1LL*size[x]*size[to];size[x]+=size[to];
} }
void getans() {
for(int i=n-;i>=;i--) sum[i]+=sum[i+],ans[i]=max(ans[i],ans[i+]);
for(int i=;i<=n-;i++) if(sum[i]) printf("%lld %lld\n",sum[i],ans[i]); else printf("0 0\n");
} }sam; int main() {
memset(head,-,sizeof(head));
scanf("%d",&n);
scanf("%s",s+);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=n;i>=;i--) sam.extend(s[i]-'a',a[i]);
sam.build();
sam.query();
sam.getans(); }
[BZOJ4199][Noi2015]品酒大会 树形DP+后缀自动机的更多相关文章
- [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp
品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...
- bzoj4199: [Noi2015]品酒大会(后缀数组)
题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...
- BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】
题目 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎手"两个奖项,吸 ...
- [BZOJ4199][NOI2015]品酒大会
#131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项, ...
- 并不对劲的bzoj4199: [Noi2015]品酒大会
传送门-> 又称普及大会. 这题没什么好说的……后缀自动机裸题……并不对劲的人太菜了,之前照着标程逐行比对才过了这道题,前几天刚刚把这题一遍写对…… 这题的输出和某两点相同后缀的长度有关,那么把 ...
- BZOJ4199 NOI2015品酒大会(后缀树)
利用SAM建出后缀树,树上每个节点计算一下|right|.right集合中ai的最大.次大.最小.次小值即可. #include<iostream> #include<cstdio& ...
- 2019.02.28 bzoj4199: [Noi2015]品酒大会(sam+线段树)
传送门 题意:给一个串,每个位置有一个权值,当S[s...s+len−1]=S[t...t+len−1]&&S[s...s+len]̸=S[t..t+len]S[s...s+len-1 ...
随机推荐
- OpenCV尺寸调整
#include<cv.h> #include<highgui.h> int main(int argc, char** argv) { IplImage* img = cvL ...
- HDU 2135 Rolling table
http://acm.hdu.edu.cn/showproblem.php?pid=2135 Problem Description After the 32nd ACM/ICPC regional ...
- Visual Source Safe的使用方法
VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目.管理软件开发中各 ...
- poj3347 Kadj Squares (计算几何)
D - Kadj Squares Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Su ...
- [Leetcode] Remove duplicates from sorted array 从已排序的数组中删除重复元素
Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...
- libusb 示例
#include <usb.h> #include <stdio.h> #define VERSION "0.1.0" #define VENDOR_ID ...
- bzoj 2425 [HAOI2010]计数 dp+组合计数
[HAOI2010]计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 451 Solved: 289[Submit][Status][Discus ...
- bzoj 5094 [Lydsy1711月赛]硬盘检测 概率dp
[Lydsy1711月赛]硬盘检测 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 273 Solved: 75[Submit][Status][Dis ...
- CSS3学习笔记之立体线框球形动画
效果截图: HTML代码: <div class="ball-box"> <div class="ball"> <div clas ...
- express添加拦截器
var express = require('express') , routes = require('./routes') , http = require('http') , pat ...