由于要找后缀的前缀,所以先用反串建立SAM。
link边组成了后缀树。
两个子串的最长公共前缀是LCA的step
树形dp即可。
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. #define maxn 1200000
  8. using namespace std;
  9. struct edge {
  10. int to,next;
  11. }e[maxn];
  12. int n,a[maxn];
  13. char s[maxn];
  14. int head[maxn],d;
  15. long long ans[maxn],mx[maxn],mn[maxn],sum[maxn];
  16. struct data {
  17. int last,cnt;
  18. int son[maxn][],link[maxn],step[maxn],v[maxn],size[maxn];
  19. int tmp[maxn];
  20. data() {last=cnt=;v[]=;}
  21. void extend(int c,int val) {
  22. int p=last,np=last=++cnt;step[np]=step[p]+;v[np]=val,size[np]=;
  23. while(p&&!son[p][c]) son[p][c]=np,p=link[p];
  24. if(!p) link[np]=;
  25. else {
  26. int q=son[p][c];
  27. if(step[q]==step[p]+) link[np]=q;
  28. else {
  29. int nq=++cnt;v[nq]=;
  30. memcpy(son[nq],son[q],sizeof(son[q]));
  31. link[nq]=link[q];
  32. link[q]=link[np]=nq;
  33. step[nq]=step[p]+;
  34. while(son[p][c]==q&&p) son[p][c]=nq,p=link[p];
  35. }
  36. }
  37. }
  38. void add(int u,int v) {e[d].next=head[u];e[d].to=v;head[u]=d++;}
  39. void build() {for(int i=;i<=cnt;i++) add(link[i],i),ans[i]=-21474836470000000000000LL;}
  40. void query(int x) {
  41. mx[x]=-;mn[x]=;
  42. if(v[x]!=) mx[x]=mn[x]=v[x];
  43. for(int i=head[x];i>=;i=e[i].next) {
  44. int to=e[i].to;
  45. query(to);
  46. 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]));
  47. mx[x]=max(mx[x],mx[to]);mn[x]=min(mn[x],mn[to]);
  48. sum[step[x]]+=1LL*size[x]*size[to];size[x]+=size[to];
  49. }
  50.  
  51. }
  52. void getans() {
  53. for(int i=n-;i>=;i--) sum[i]+=sum[i+],ans[i]=max(ans[i],ans[i+]);
  54. for(int i=;i<=n-;i++) if(sum[i]) printf("%lld %lld\n",sum[i],ans[i]); else printf("0 0\n");
  55. }
  56.  
  57. }sam;
  58.  
  59. int main() {
  60. memset(head,-,sizeof(head));
  61. scanf("%d",&n);
  62. scanf("%s",s+);
  63. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  64. for(int i=n;i>=;i--) sam.extend(s[i]-'a',a[i]);
  65. sam.build();
  66. sam.query();
  67. sam.getans();
  68.  
  69. }

[BZOJ4199][Noi2015]品酒大会 树形DP+后缀自动机的更多相关文章

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

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

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

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

  3. [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp

    品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...

  4. bzoj4199: [Noi2015]品酒大会(后缀数组)

    题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...

  5. BZOJ4199 [Noi2015]品酒大会 【后缀数组 + 单调栈 + ST表】

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

  6. [BZOJ4199][NOI2015]品酒大会

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

  7. 并不对劲的bzoj4199: [Noi2015]品酒大会

    传送门-> 又称普及大会. 这题没什么好说的……后缀自动机裸题……并不对劲的人太菜了,之前照着标程逐行比对才过了这道题,前几天刚刚把这题一遍写对…… 这题的输出和某两点相同后缀的长度有关,那么把 ...

  8. BZOJ4199 NOI2015品酒大会(后缀树)

    利用SAM建出后缀树,树上每个节点计算一下|right|.right集合中ai的最大.次大.最小.次小值即可. #include<iostream> #include<cstdio& ...

  9. 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 ...

随机推荐

  1. iOS银联,支付宝,微信,ping++开发文档

    银联支付 银联支付目测只需两个参数 1.tn 其实就是订单号 2.mode 是测试环境还是线上环境 开发步骤 1.首先客户端浏览商品,点击下单,请求到达商户后台 2.商户后台在提交订单信息到银联后台 ...

  2. http请求整理

    终于又回来了,先来简单整理一波http请求的信息.对于前端来说,不管是在面试还是在实际项目中,都有必要去了解一些关于http的信息. http请求包含三部分:请求行request line.请求头re ...

  3. [CCF] 201612-2 工资计算

    [思路]按照题意对初始工资S进行循环,计算缴税后工资,若与T相等则退出循环,输出结果. #include <iostream> #include <windows.h> usi ...

  4. [学习笔记]最小割之最小点权覆盖&&最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  5. URAL1277 Cops and Thieves(最小割)

    Cops and Thieves Description: The Galaxy Police (Galaxpol) found out that a notorious gang of thieve ...

  6. canvas知识02:图片放大镜效果

    效果截图: JS代码: <script> // 初始化canvas01和上下文环境 var cav01 = document.getElementById('cav01'); var cx ...

  7. java迭代map

    java迭代map: import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.ut ...

  8. DecimalFormat中格式化问题

    一:前言 每天自己斗会看到新的东西,每天自己都会学到东西,但是觉得自己老是想一口吃一个胖子.每天看到一个知识点都把其收藏了,但是自己也没有时间去看,不知道自己到底想感谢什么.真是自己无语,本来说是把自 ...

  9. kettle基础操作

    ETL:抽取(extract).转换(transform).加载(load)至目的端的过程: Kettle是ETL工具代表之一,是pentaho中的一个数据整合的一个组件.Kettle里包括多个Job ...

  10. 正则表达式 re模块 collections模块

    根据手机号码一共11位并且是只以13.14.15.18开头的数字这些特点,我们用python写了如下代码: while True: phone_number = input('please input ...