题解 P3426 【[POI2005]SZA-Template】

· · 题解

首先考虑,这个印章肯定是原串的一个 \text{Border},因此一定在失配树上,根节点到编号为 \text{len} 的节点的路径上的一点。

而怎么样的路径是合法的呢?对于 一个 \text{Border}\text{pre}(s,i) ,怎么样才能让它是合法的印章,显然它要通过连接拼出原串。而我们考虑每一个印章的结束位置,设这个结束位置为 j 那么一定满足 \text{pre}(s,i)\text{pre}(s,j)\text{Border},也就是在失配树中 i 的子树中。

那么我们考虑每个这样的节点,如果有两个节点之间距离 >i 那么就会发现这两个印章之间必然会出现空隙,不能拼接完成。而如果距离 \leq i 那么一定可以拼成。

综上,我们总结出了这个印章串 \text{pre}(s,i) 需要满足的性质:

那么只需要维护最大距离即可。首先把从根节点到 \text{len} 节点之间的路径打上标记。

考虑从根节点开始,每次把在下一次统计的子树以外的东西全部删掉,使用双向链表维护最大值即可,\mathcal O(n)。如果不能理解,可能参考代码更容易理解一些。

Code Here