[bzoj3238]差异(后缀数组+单调栈)
显然我们可以先把len(Ti)+len(Tj)的值先算出来,再把LCP减去。所有len(Ti)+len(Tj)的值为n*(n-1)*(n+1)/2,这个随便在纸上画一画就可以算出来的。
接下来问题就是如何把LCP减去。我们先用后缀数组把height求出来,当有一段区间l~r,height[i]为height[l]~height[r]中的最小值,那么随便取rk[l]~rk[r]中的两个后缀,他们的LCP则都是height[i],这个很好理解吧。那么l~r这个区间里有(l-i+1)*(r-i+1)对后缀,所以我们最后的答案就要减去2*height[i]*(l-i+1)*(r-i+1)【1≤i≤n】。
然后就是如何求出每一个i的l~r了,暴力枚举+RMQ显然不行,那我们就用一个单调栈,栈里存着i前面height值比height[i]小的height值的编号,记为j,如果height[j]比height[i]大那么就弹出,那么这段区间的左端点则为栈顶的j+1,右端点同理。这样我们就可以求出每个height的l和r了。
奇丑无比的代码如下:
var
s:ansistring;
i:longint;
n,m,l,r,ans,top:int64;
rk,trk,sa,tsa,sum,h,ll,rr,st:array[..]of int64; procedure suffix;
var
i,j,p:longint;
begin
for i:= to n do begin trk[i]:=ord(s[i]);inc(sum[trk[i]]);end;
for i:= to do inc(sum[i],sum[i-]);
for i:=n downto do begin sa[sum[trk[i]]]:=i;dec(sum[trk[i]]);end;
rk[sa[]]:=;p:=;
for i:= to n do begin if trk[sa[i]]<>trk[sa[i-]] then inc(p);rk[sa[i]]:=p;end;
m:=p;j:=;
while m<n do
begin
move(rk,trk,sizeof(rk));fillchar(sum,sizeof(sum),);p:=;
for i:=n-j+ to n do begin inc(p);tsa[p]:=i;end;
for i:= to n do if sa[i]>j then begin inc(p);tsa[p]:=sa[i]-j;end;
for i:= to n do begin rk[i]:=trk[tsa[i]];inc(sum[rk[i]]);end;
for i:= to n do inc(sum[i],sum[i-]);
for i:=n downto do begin sa[sum[rk[i]]]:=tsa[i];dec(sum[rk[i]]);end;
rk[sa[]]:=;p:=;
for i:= to n do
begin
if (trk[sa[i]]<>trk[sa[i-]])or(trk[sa[i]+j]<>trk[sa[i-]+j])then inc(p);
rk[sa[i]]:=p;
end;
m:=p;j:=j*;
end;
h[]:=;p:=;
for i:= to n do
begin
if rk[i]= then continue;
j:=sa[rk[i]-];
while s[i+p]=s[j+p] do inc(p);
h[rk[i]]:=p;
if p> then dec(p);
end;
end; begin
readln(s);
n:=length(s);
s:=s+' ';
suffix;
ans:=n*(n-)*(n+)div ;
h[]:=-maxlongint;
for i:= to n do
begin
while h[i]<=h[st[top]] do dec(top);
if st[top]= then ll[i]:=
else ll[i]:=st[top]+;
inc(top);
st[top]:=i;
end;
h[n+]:=-maxlongint;top:=;st[]:=n+;
for i:=n downto do
begin
while h[i]<h[st[top]] do dec(top);
if st[top]=n+ then rr[i]:=n
else rr[i]:=st[top]-;
inc(top);
st[top]:=i;
end;
for i:= to n do
ans:=ans-*(i-ll[i]+)*(rr[i]-i+)*h[i];
writeln(ans);
end.
[bzoj3238]差异(后缀数组+单调栈)的更多相关文章
- 【BZOJ-3238】差异 后缀数组 + 单调栈
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1561 Solved: 734[Submit][Status] ...
- 【BZOJ3238】[Ahoi2013]差异 后缀数组+单调栈
[BZOJ3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- [AHOI2013] 差异 - 后缀数组,单调栈
[AHOI2013] 差异 Description 求 \(\sum {len(T_i) + len(T_j) - 2 lcp(T_i,T_j)}\) 的值 其中 \(T_i (i = 1,2,... ...
- bzoj3238 [Ahoi2013]差异 后缀数组+单调栈
[bzoj3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...
- BZOJ3238 [Ahoi2013]差异 【后缀数组 + 单调栈】
题目链接 BZOJ3238 题解 简单题 经典后缀数组 + 单调栈套路,求所有后缀\(lcp\) #include<iostream> #include<cstdio> #in ...
- BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈
BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...
- 【BZOJ3879】SvT 后缀数组+单调栈
[BZOJ3879]SvT Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干 ...
- BZOJ_3879_SvT_后缀数组+单调栈
BZOJ_3879_SvT_后缀数组+单调栈 Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个 ...
- BZOJ.4199.[NOI2015]品酒大会(后缀数组 单调栈)
BZOJ 洛谷 后缀自动机做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 显然只需要考虑极长的相同子串的贡献,然后求后缀和/后缀\(\max\)就可以了. 对于相同子串,我们能想 ...
随机推荐
- jmeter执行顺序及作用域规则
1.执行顺序 配置元件 前置处理器 定时器 采样器 后置处理器 断言 监听器 备注: 服务器响应为空的话后三个不执行 作用域内存在采样器时定时器.断言.前置/后置处理器才执行 逻辑控制器和采样器按照在 ...
- 【Jmeter测试】BeanShell介绍和使用
BeanShell是什么? BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言: BeanShell是用Jav ...
- perf + 火焰图用法 小结
要对新服务做性能测试,分析代码热点,初识perf,做下总结 perf + 火焰图用法 perf简介 Perf (Performance Event), Linux 系统原生提供的性能分析工具, 会返回 ...
- Jmeter接口测试(九)授权
下面应该是jmeter的授权设置,但是由于本人目前对这块了解还不深,暂时写个标题,以后有时间再来补充,大家可以先看下一篇内容
- CSP201403-3:命令行选项
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- Bellman-ford 模板
#include<bits/stdc++.h> const int inf=0x3f3f3f3f; ; struct edge{ int u,v;//两个点 int w; //权值 Edg ...
- Amazon.com 购物 信用卡预售期
I understand and thanks for confirming. In this case, the $1.00 is not a charge. It is an authoriza ...
- $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 区别
PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别 PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 通常情况下,PHP ...
- Scrum立会报告+燃尽图(十月十三日总第四次):前期宣传相关工作
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2194 Scrum立会master:刘欣 一.小组介绍 组长:付佳 组员: ...
- 基础系列(4)—— C#装箱和拆箱
一 装箱和拆箱的概念 装箱是将值类型转换为引用类型 : 拆箱是将引用类型转换为值类型 : 值类型:包括原类型(Sbyte.Byte.Short.Ushort.Int.Uint.Long.Ulong.C ...