以前一直听说什么后缀数组height合并之类的

表示我这种后缀数组都敲不熟的蒟蒻怎么会写

但是做了做觉得还是很简单的嘛

这个题是有两问的,第一问是求LCP>=R的后缀对有多少个

这个就是AHOI2013 差异 稍微变个形啦

直接逆序建后缀自动机,在parent树上做一个很简单的树P就可以了

因为对于现在parent树而言,任意两点的LCP等于两点在树上的LCA的len

到这里,其实我们已经可以拿到70分了

一部分数据暴力,一部分数据LCP<10也可以暴力,还有一部分数据ai相等,等价于只用求第一问

之后我们考虑第二问,对于当前的parent树而言,等价于求parent树上两个叶节点乘积的最大值

又因为考虑到ai可能是负数,所以我们只需要记录最大值,次大值,最小值,次小值就可以了

这也是一个非常简单的树P

UPD:题目可以去UOJ去看

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;typedef long long LL;
const int maxn=600010;
const LL oo=1LL<<62;
int n,cnt,la;
int a[maxn];
char s[maxn];
struct Node{int next[26];int len,link;
}st[maxn];
int t[maxn],b[maxn];
LL ans1[maxn],ans2[maxn];
LL mx[maxn],cmx[maxn];
LL mn[maxn],cmn[maxn];
LL sum[maxn];void read(int &num){num=0;int f=1;char ch=getchar();while(ch<'!')ch=getchar();if(ch=='-')f=-1,ch=getchar();while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();num*=f;
}
void init(){cnt=la=0;st[0].link=-1;
}
void add(int c){int cur=++cnt;st[cur].len=st[la].len+1;int p;for(p=la;p!=-1&&st[p].next[c]==0;p=st[p].link)st[p].next[c]=cur;if(p==-1)st[cur].link=0;else{int q=st[p].next[c];if(st[q].len==st[p].len+1)st[cur].link=q;else{int clone=++cnt;st[clone]=st[q];st[clone].len=st[p].len+1;for(;p!=-1&&st[p].next[c]==q;p=st[p].link)st[p].next[c]=clone;st[cur].link=st[q].link=clone;}}la=cur;
}int main(){read(n);scanf("%s",s+1);init();for(int i=1;i<=n;++i)read(a[i]);for(int i=n;i>=1;--i)add(s[i]-'a');for(int i=0;i<=cnt;++i){mx[i]=-oo;cmx[i]=-oo;mn[i]=oo;cmn[i]=oo;}int now=0;for(int i=n;i>=1;--i){int id=s[i]-'a';now=st[now].next[id];sum[now]++;mx[now]=a[i];mn[now]=a[i];}for(int i=0;i<=cnt;++i)t[st[i].len]++;for(int i=1;i<=n;++i)t[i]+=t[i-1];for(int i=0;i<=cnt;++i)b[--t[st[i].len]]=i;for(int i=0;i<=n;++i)ans2[i]=-oo;for(int i=cnt;i>=0;--i){int v=b[i],u=st[v].link,R=st[v].len,L=st[u].len;LL tmp=-oo;if(cmx[v]!=-oo)tmp=max(tmp,mx[v]*cmx[v]);if(cmn[v]!=oo)tmp=max(tmp,mn[v]*cmn[v]);if(tmp!=-oo)ans2[R]=max(ans2[R],tmp);ans1[L]+=sum[u]*sum[v];sum[u]=sum[u]+sum[v];if(mx[v]>=mx[u]){cmx[u]=mx[u];mx[u]=mx[v];}else if(mx[v]>cmx[u])cmx[u]=mx[v];if(mn[v]<=mn[u]){cmn[u]=mn[u];mn[u]=mn[v];}else if(mn[v]<cmn[u])cmn[u]=mn[v];}for(int i=n-1;i>=0;--i)ans1[i]+=ans1[i+1];for(int i=n-1;i>=0;--i)ans2[i]=max(ans2[i],ans2[i+1]);for(int i=0;i<n;++i){if(!ans1[i])ans2[i]=0;printf("%lld %lld\n",ans1[i],ans2[i]);}return 0;
}

  

转载于:https://www.cnblogs.com/joyouth/p/5366396.html

BZOJ 4199 品酒大会相关推荐

  1. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)

    UOJ #131 BZOJ 4199 luogu P2178[NOI2015]品酒大会 (后缀自动机.树形DP) 水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.or ...

  2. BZOJ 4199 [Noi2015]品酒大会(后缀自动机 + parent树上统计)

    4199: [Noi2015]品酒大会 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1598  Solved: 905 [Submit][Stat ...

  3. [bzoj 4199][NOI 2015]品酒大会

    传送门 Description 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发"首席品 酒家"和"首席猎 ...

  4. [BZOJ4199][NOI2015]品酒大会-后缀数组

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

  5. [NOI2015]品酒大会

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

  6. NOI 2015 品酒大会

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

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

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

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

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

  9. BZOJ.4199.[NOI2015]品酒大会(后缀自动机 树形DP)

    BZOJ 洛谷 后缀数组做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 只考虑求极长相同子串,即所有后缀之间的LCP. 而后缀的LCP在后缀树的LCA处.同差异这道题,在每个点处 ...

  10. [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)

    Time Limit: 10 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 ponoiiipoi 2 1 4 7 ...

最新文章

  1. 栏目信息开源 免费 java CMS - FreeCMS1.3 标签 infoList
  2. THREE TRACKS AT UNIVERSITY
  3. 7-33 地下迷宫探索 (30 分)(思路加详解)
  4. java中多个输入框搜索_如何在一个搜索框中输入多个字段的值进行查询?
  5. 九、一篇文章帮助你读懂CSS属性:vertical-align 垂直对齐
  6. 简单的CreateRemoteThread例程-初学者必看
  7. noip2017day2
  8. 三星、联想和微软的设备将搭载Android 12L
  9. mysqldump: Got errno 28 on write
  10. Dolibarr可以做什么
  11. MeiTuanLocateCity
  12. 【STC单片机学习】第八课:单片机的LED点阵
  13. 计算机硬件故障解决方法,计算机硬件故障分析与解决方法
  14. kappa一致性检验教程_一致性检验的几种方式--ICC、kappa、weighted kappa、Kendall
  15. 中天科技(600522)
  16. 怎么画人体(动漫人体教程)
  17. mips-mti-gnu-linux,【歪门邪道】利用WSL搭建MIPS32构建环境
  18. FastDFS清空数据及文件步骤
  19. 大学计算机作业互评评语简短,大学学生互评评语100字简短
  20. NETapp Snapshot介绍

热门文章

  1. IOS 发展史各个ipone的发布时间(二)
  2. [TravelNotes] CTSC 2017 APIO 2017 THUPC 2017 游记
  3. 题解 P1774 【最接近神的人_NOI导刊2010提高(02)】
  4. WPS 解决插入尾注后无法添加分节页符
  5. 使用计算机眼睛保护方法有哪些,使用电脑保护眼睛的方法有哪些
  6. 10分钟明白为什么要使用微服务
  7. MMA7455加速度传感器測量角度
  8. Linux 服务器进行安全加固,防止黑客攻击
  9. 车牌检测STN:Spatial Transformer Networks
  10. 预测web服务的未来