LOJ6041

题意

给定一个01串,多次查询以\([l,r]\)结尾的前缀,设为\(pre_i\),求\(max_{i,j,i\neq j}\{LCP(pre_i,pre_j)\}\),其中\(LCP\)为最长公共后缀

做法一

建出后缀树,一开始节点内存的东西为空

考虑从左往右枚举\(r\),祖先\(x\)对答案的贡献就是:设\(l\)\(x\)子树内最大值,\(Query(1..l,r)=len_x\)
\(r\)放在该点

这个可以用\(lct,bit\)进一步优化到\(O(nlog^2n)\)

做法二

线段树合并求出每个位置的\(right\),一个位置\(i\)对答案的有效贡献为:左右两侧较近的\(right\)

然后就是一个二维平面求最大值的问题了

posted @ 2020-03-08 16:35  Grice  阅读(172)  评论(0编辑  收藏  举报