问题描述
佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物。生日礼物放在一个神奇的箱子中。箱子外边写了一个长为 $ n $ 的字符串 $ s $,和 $ m $ 个问题。佳媛姐姐必须正确回答这 $ m $ 个问题,才能打开箱子拿到礼物,升职加薪,出任 CEO,嫁给高富帅,走上人生巅峰。每个问题均有 $a, b, c, d$ 四个参数,问你子串
$s[a \ldots b]$ 的所有子串和 $s[c \ldots d]$ 的最长公共前缀的长度的最大值是多少?佳媛姐姐并不擅长做这样的问题,所以她向你求助,你该如何帮助她呢?
算法讨论
首先二分一个答案$mid$,问题变为判定$[a,b-mid+1]$区间内的后缀与后缀$c$的LCP是否$\ge mid$
首先把后缀数组的那几样东西都求出来,要满足某后缀$x$与后缀$c$的LCP大于某值,就要满足$rank[x]$与$rand[c]$之间的$height$的最小值比它大,我们倍增得往$c$两侧扩展,得到一个满足条件的区间$[L,R]$,也就是说$rank$在$[L,R]$之间的后缀都满足条件,于是我们只需要知道$[a,b-mid+1]$区间的有没有这种后缀即可,二维问题用主席树即可
1 |
|