bzoj4199:NOI2015D2T2品酒大会(SAM版)
SAM感觉写起来比SA更直观(?)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define N 600005 using namespace std;
inline int read(){
int ret=0;char ch=getchar();
bool flag=0;
while (ch<'0'||ch>'9'){
flag=ch=='-';
ch=getchar();
}
while ('0'<=ch&&ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return flag?-ret:ret;
}
inline char readch(){
char ch=getchar();
while (!isalpha(ch)) ch=getchar();
return ch;
} struct SAM{
int max0[N],max1[N],min0[N],min1[N];
#define u q[i]
struct SAMnode{
int par,mx,go[26],rights;
SAMnode(){}
SAMnode(int _mx):par(0),mx(_mx),rights(0){
memset(go,0,sizeof(go));
}
} t[N];
int last,size;
int newnode(int _mx){
t[++size]=SAMnode(_mx);
max0[size]=max1[size]=-(min0[size]=min1[size]=2e9);
return size;
}
void clear(){size=0;last=newnode(0);}
void extend(char c,int data){
c-='a';
int p=last,np=newnode(t[p].mx+1);t[np].rights=1;
max0[np]=min0[np]=data;
for (;p&&!t[p].go[c];p=t[p].par) t[p].go[c]=np;
if (!p) t[np].par=1;
else{
int q=t[p].go[c];
if (t[p].mx+1==t[q].mx) t[np].par=q;
else{
int nq=newnode(t[p].mx+1);
memcpy(t[nq].go,t[q].go,sizeof(t[q].go));
t[nq].par=t[q].par;
t[q].par=t[np].par=nq;
for (;p&&t[p].go[c]==q;p=t[p].par) t[p].go[c]=nq;
}
}
last=np;
}
int v[N],q[N];
void precompute(){
memset(v,0,sizeof(v));
for (int i=1;i<=size;++i) ++v[t[i].mx];
for (int i=1;i<=size;++i) v[i]+=v[i-1];
for (int i=size;i;--i) q[v[t[i].mx]--]=i;
t[0].mx=-1;
}
void Max(int x,int data){
max1[x]=max(max1[x],data);
if (max1[x]>max0[x]) swap(max1[x],max0[x]);
}
void Min(int x,int data){
min1[x]=min(min1[x],data);
if (min1[x]<min0[x]) swap(min1[x],min0[x]);
}
void solve(ll *cnt,ll *maxv){
for (int i=size;i;--i){
if (t[u].rights>1){
maxv[t[u].mx]=max(maxv[t[u].mx],max((ll)max0[u]*max1[u],(ll)min0[u]*min1[u]));
ll tmp=(ll)t[u].rights*(t[u].rights-1)/2;
cnt[t[u].mx]+=tmp;
cnt[t[t[u].par].mx]-=tmp;
}
t[t[u].par].rights+=t[u].rights;
Max(t[u].par,max0[u]);
Max(t[u].par,max1[u]);
Min(t[u].par,min0[u]);
Min(t[u].par,min1[u]);
}
}
} sam; char st[N];int a[N],n;
ll cnt[N],ans[N];
int main(){
n=read();
for (int i=1;i<=n;++i) st[i]=readch();
for (int i=1;i<=n;++i) a[i]=read();
sam.clear();
for (int i=n;i;--i) sam.extend(st[i],a[i]);
sam.precompute();
memset(ans,128,sizeof(ans));
memset(cnt,0,sizeof(cnt));
sam.solve(cnt,ans);
for (int i=n-1;i>=0;--i) cnt[i]+=cnt[i+1];
for (int i=n-1;i>=0;--i) ans[i]=max(ans[i],ans[i+1]);
for (int i=n-1;i>=0;--i) if (!cnt[i]) ans[i]=0;
for (int i=0;i<n;++i) printf("%lld %lld\n",cnt[i],ans[i]);
return 0;
}
bzoj4199:NOI2015D2T2品酒大会(SAM版)的更多相关文章
- [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- bzoj4199: [Noi2015]品酒大会(后缀数组)
题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...
- [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp
品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...
- [BZOJ4199][NOI2015]品酒大会
#131. [NOI2015]品酒大会 统计 描述 提交 自定义测试 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项, ...
- 【BZOJ-4199】品酒大会 后缀数组 + 并查集合并集合
4199: [Noi2015]品酒大会 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 436 Solved: 243[Submit][Status] ...
- BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】
题目 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎手"两个奖项,吸 ...
- 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 ...
- [BZOJ4199][Noi2015]品酒大会 树形DP+后缀自动机
由于要找后缀的前缀,所以先用反串建立SAM. link边组成了后缀树. 两个子串的最长公共前缀是LCA的step 树形dp即可. #include<iostream> #include&l ...
随机推荐
- iOS 获取相册中图片的名字 url
__block NSString *imageFileName; NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenc ...
- Android—定位
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button ...
- python之import子目录文件
问题: 在pre_tab.py文件下: print("AA") from test.te import login1 login1() from test.te import ...
- 在CentOS7上安装JDK1.8
在CentOS7上安装JDK1.8 1 通过 SecureCRT 连接到阿里云 CentOS7 服务器: 2 进入到目录 /usr/local/ 中: cd /usr/local/ 3 创建目录 to ...
- 基于Flume+LOG4J+Kafka的日志采集架构方案
本文将会介绍如何使用 Flume.log4j.Kafka进行规范的日志采集. Flume 基本概念 Flume是一个完善.强大的日志采集工具,关于它的配置,在网上有很多现成的例子和资料,这里仅做简单说 ...
- JVM-操作码助记符
整理如下,用于以后查找: Opcode Mnemonics Note Constants 0x00 nop 无动作 0x01 aconst_null 把 null 推到操作数栈 0x02 iconst ...
- GConf error:Failed to contact configuration server
Linux系统运行一直正常,但是图形界面使用root账号登录时遇到下面错误,第一次遇到这么怪异的状况 具体错误信息如下所示: GConf error:Failed to contact configu ...
- jquery本地上传预览扩展(隐藏上传控件单击图片上传支持ie!!)
我用到的原材料地址:http://www.cnblogs.com/leejersey/p/3660202.html 修改后: /// <reference path="../../Js ...
- PostgreSQL-pg_dump,pg_restore
逻辑备份和psql一样,pg_dump.pg_restore有基本的和数据库连接的参数 -h 目标地址(对应环境变量$PGHOST) -p 连接端口(对应环境变量$PGPORT) -U 连接使用的用户 ...
- 2015年度总结--javaWeb
注:本来应该前的发,不过过年没有心思管博客了,另外网络也不是很方便,我想可以帮助大家了解一下javaweb吧. 之前的文章中说到,由于要做手机端安卓程序,所以开始使用java.实际上大部分的java程 ...