题意:

两杯“r相似” (r>1)的酒同时也是“1 相似”、“2 相似”、……、“(r−1) 相似”的。

n<=300000 abs(a[i])<=10^9

思路:对于i,j两个后缀,它们的贡献只与它们的lcp有关

而lcp又是它们之间height的最小值

所以可以把height从大到小排序

然后用并查集合并最值,方案数之类的

每次合并的都是排名相邻的一对后缀,相当于一段不相交的线段

每个集合中的lcp即为height的最小值

将r相似的加到r-1相似中

被UOJ的extra卡了一发,原来是0相似的初始最大值忘记初始化了

  1. const oo=<<;
  2. var sum,f:array[..]of int64;
  3. sa,rank,height,id,mx,mn,size,a,fa,x,y,wc,wd,b:array[..]of longint;
  4. n,m,i,p,q,t:longint;
  5. ch:ansistring;
  6. procedure swap(var x,y:longint);
  7. var t:longint;
  8. begin
  9. t:=x; x:=y; y:=t;
  10. end;
  11.  
  12. function max(x,y:int64):int64;
  13. begin
  14. if x>y then exit(x);
  15. exit(y);
  16. end;
  17.  
  18. function min(x,y:longint):longint;
  19. begin
  20. if x<y then exit(x);
  21. exit(y);
  22. end;
  23.  
  24. procedure qsort(l,r:longint);
  25. var i,j,mid:longint;
  26. begin
  27. i:=l; j:=r; mid:=height[id[(l+r)>>]];
  28. repeat
  29. while mid<height[id[i]] do inc(i);
  30. while mid>height[id[j]] do dec(j);
  31. if i<=j then
  32. begin
  33. swap(id[i],id[j]);
  34. inc(i); dec(j);
  35. end;
  36. until i>j;
  37. if l<j then qsort(l,j);
  38. if i<r then qsort(i,r);
  39. end;
  40.  
  41. function find(k:longint):longint;
  42. begin
  43. if fa[k]<>k then fa[k]:=find(fa[k]);
  44. find:=fa[k];
  45. end;
  46.  
  47. procedure merge(x,y:longint);
  48. begin
  49. size[y]:=size[y]+size[x];
  50. mx[y]:=max(mx[x],mx[y]);
  51. mn[y]:=min(mn[x],mn[y]);
  52. fa[x]:=y;
  53. end;
  54.  
  55. function cmp(a,b,l:longint):boolean;
  56. begin
  57. exit((y[a]=y[b])and(y[a+l]=y[b+l]));
  58. end;
  59.  
  60. procedure getsa(n:longint);
  61. var i,j,p:longint;
  62. begin
  63. for i:= to n- do
  64. begin
  65. x[i]:=a[i];
  66. inc(wc[a[i]]);
  67. end;
  68. for i:= to m- do wc[i]:=wc[i-]+wc[i];
  69. for i:=n- downto do
  70. begin
  71. dec(wc[x[i]]);
  72. sa[wc[x[i]]]:=i;
  73. end;
  74. j:=; p:=;
  75. while p<n do
  76. begin
  77. p:=;
  78. for i:=n-j to n- do
  79. begin
  80. y[p]:=i; inc(p);
  81. end;
  82. for i:= to n- do
  83. if sa[i]>=j then begin y[p]:=sa[i]-j; inc(p); end;
  84. for i:= to n- do wd[i]:=x[y[i]];
  85. for i:= to m- do wc[i]:=;
  86. for i:= to n- do inc(wc[wd[i]]);
  87. for i:= to m- do wc[i]:=wc[i-]+wc[i];
  88. for i:=n- downto do
  89. begin
  90. dec(wc[wd[i]]);
  91. sa[wc[wd[i]]]:=y[i];
  92. end;
  93. for i:= to n do swap(x[i],y[i]);
  94. p:=; x[sa[]]:=;
  95. for i:= to n- do
  96. if cmp(sa[i-],sa[i],j) then x[sa[i]]:=p-
  97. else
  98. begin
  99. x[sa[i]]:=p; inc(p);
  100. end;
  101. j:=j*;
  102. m:=p;
  103. end;
  104. end;
  105.  
  106. procedure getheight(n:longint);
  107. var i,j,k:longint;
  108. begin
  109. for i:= to n do rank[sa[i]]:=i;
  110. k:=;
  111. for i:= to n- do
  112. begin
  113. if k> then dec(k);
  114. j:=sa[rank[i]-];
  115. while a[i+k]=a[j+k] do inc(k);
  116. height[rank[i]]:=k;
  117. end;
  118. end;
  119.  
  120. begin
  121. assign(input,'bzoj4199.in'); reset(input);
  122. assign(output,'bzoj4199.out'); rewrite(output);
  123. readln(n);
  124. readln(ch);
  125. for i:= to n- do a[i]:=ord(ch[i+])-ord('a')+;
  126. a[n]:=; m:=;
  127. getsa(n+);
  128. getheight(n);
  129. for i:= to n- do read(b[i]);
  130. for i:= to n do
  131. begin
  132. fa[i]:=i;
  133. size[i]:=; mx[i]:=b[sa[i]]; mn[i]:=mx[i];
  134. f[i]:=-oo;
  135. end;
  136. f[]:=-oo;
  137. for i:= to n- do id[i]:=i+;
  138. qsort(,n-);
  139. for i:= to n- do
  140. begin
  141. p:=find(id[i]-); q:=find(id[i]);
  142. t:=height[id[i]];
  143. sum[t]:=sum[t]+int64(size[p])*size[q];
  144. f[t]:=max(f[t],int64(mx[p])*mx[q]);
  145. f[t]:=max(f[t],int64(mx[p])*mn[q]);
  146. f[t]:=max(f[t],int64(mn[p])*mx[q]);
  147. f[t]:=max(f[t],int64(mn[p])*mn[q]);
  148. merge(p,q);
  149. end;
  150. for i:=n- downto do
  151. begin
  152. sum[i]:=sum[i]+sum[i+];
  153. f[i]:=max(f[i],f[i+]);
  154. end;
  155. for i:= to n- do
  156. if f[i]>-oo then writeln(sum[i],' ',f[i])
  157. else writeln(,' ',);
  158.  
  159. close(input);
  160. close(output);
  161. end.

【BZOJ4199&UOJ131】品酒大会(后缀数组,并查集)的更多相关文章

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

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

  2. NOI 2015 品酒大会 (后缀数组+并查集)

    题目大意:略 40分暴力还是很好写的,差分再跑个后缀和 和 后缀最大值就行了 一种正解是后缀数组+并查集 但据说还有后缀数组+单调栈的高端操作蒟蒻的我当然不会 后缀数组求出height,然后从大到小排 ...

  3. 【BZOJ-4199】品酒大会 后缀数组 + 并查集合并集合

    4199: [Noi2015]品酒大会 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 436  Solved: 243[Submit][Status] ...

  4. 【BZOJ4199】[Noi2015]品酒大会 后缀数组+并查集

    [BZOJ4199][Noi2015]品酒大会 题面:http://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=2144 题解:听说能用SAM?SA默默 ...

  5. [NOI2015] 品酒大会 - 后缀数组,并查集,STL,启发式合并

    [NOI2015] 品酒大会 Description 对于每一个 \(i \in [0,n)\) 求有多少对后缀满足 LCP 长度 \(\le i\) ,并求满足条件的两个后缀权值乘积的最大值. So ...

  6. BZOJ 4199: [Noi2015]品酒大会( 后缀数组 + 并查集 )

    求出后缀数组后, 对height排序, 从大到小来处理(r相似必定是0~r-1相似), 并查集维护. 复杂度O(NlogN + Nalpha(N)) ------------------------- ...

  7. 【学术篇】NOI2015 品酒大会 后缀数组+并查集

    省选前大致是刷不了几道题了... 所以就找一些裸一点的题目练练板子算了= = 然而这题一点都不裸, 也并不怎么好写... 于是就浪费了将近一下午的时间... 然而还不是因为后缀数组板子不熟= = 首先 ...

  8. Uoj #131. 【NOI2015】品酒大会 后缀数组,并查集

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

  9. BZOJ 4566 JZYZOJ 1547 [haoi2016T5]找相同子串 后缀数组 并查集

    http://172.20.6.3/Problem_Show.asp?id=1547 http://www.lydsy.com/JudgeOnline/problem.php?id=4566 单纯后缀 ...

  10. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

随机推荐

  1. TCP/IP 3握手4挥手

    转:摘自<图解TCP/IP>P204 三次握手与四次挥手的状态转移图如下: 如图,由于第二次握手接收端发送SYN+ACK信号所以握手只用了三次,挥手由于接收端ACK和FIN分两次发的,所以 ...

  2. win7如何设置自动关机

    如果想设置Win7按照自己意愿自动关机,而又不希望下载安装第三方软件,则可以通过以下两个方法来简单实现. 工具/原料 Windows7操作系统环境 方法1:利用cmd命令 1 打开cmd窗口. 方法一 ...

  3. 对比hive和mysql查询汇总

    由于底层的处理机制大不相同,hive和mysql在查询上还是有较大差异的! 单个表的select操作 最简单的查询 ,字段2 frome 表名 where 字段 [not]in(元素1,元素2): 例 ...

  4. Farseer.net轻量级开源框架 入门篇:逻辑层的选择

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 入门篇:增.删.改.查操作演示 下一篇:Farseer.net轻量级开源框架 入门 ...

  5. linux使用crontab实现PHP执行计划定时任务

    linux使用crontab实现PHP执行计划定时任务 前几天写过一篇文章,利用单纯的php实现定时执行任务,但是效率不佳,对于linux来说用crontab实现更加合理 首先说说cron,它是一个l ...

  6. DeepMind:所谓SACX学习范式

    机器人是否能应用于服务最终还是那两条腿值多少钱,而与人交互,能真正地做"服务"工作,还是看那两条胳膊怎么工作.大脑的智能化还是非常遥远的,还是先把感受器和效应器做好才是王道. 关于 ...

  7. Linux基础之操作系统

    一.什么是操作系统 简单来说,操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 二.操作系统存在的意义 究根结底,我们日常对计算机的管理是对计算机硬件的管理.经过近百年的时间,现代 ...

  8. Java学习4_一些基础4_输入输出_16.5.7

    读取输入: 想从控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联. Scanner in=new Scanner(System.in); String na ...

  9. Android(java)学习笔记204:JNI之native方法头文件的生成

    1. JDK1.6 ,进入到工程的bin目录下classes目录下: 使用命令: javah  packageName.ClassName 会在当前目录下生成头文件,从头文件找到jni协议方法 下面举 ...

  10. Redis系列(七)--Sentinel哨兵模式

    在上一篇文章了解了主从复制,主从复制本身的容错性很差,一旦master挂掉,只能进行手动故障转移,很难完美的解决这个问题 而本文讲解的sentinel可以解决这个问题 Redis sentinel示意 ...