BSOJ1644口胡

对于每个串,找到第一次匹配成功的位置 \(x\),然后求 \(S\)\([1,x]\) 的后缀与 \(s\) 的 LCP 之和。

答案一定是 \(S\) 的子串,但是找到的匹配的位置一定是 \(s\) 的子串。

考虑对 \(s\) 建立 ACAM,然后把 \(S\) 丢上去匹配。记录一个下标就可以了,在 fail 树上面转移的时候取子树的 \(\min\)

位置求出来了,开始求 LCP。考虑按照位置离线,从小到大对 \(s\) 排序。

众所周知两个串的最长公共后缀是在后缀树上的 LCA,而反串的 parent tree 就是后缀树。可以预处理出每个后缀在后缀树上的节点编号。

然后变成了 3e6 版的 LNOI2014 LCA,直接把树剖换成 全局平衡二叉树 就可以了。

复杂度 \(O((|S|+\sum|s|)\log n)\)

posted @ 2022-04-02 11:12  Prean  阅读(26)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};