「POI 2005」SZA-Template 「失配树」「双向链表」「思维」

先来观察答案的几个强性质。

首先答案肯定是原串的一个\(\tt{border}\),也就是失配树上的一条链。

再进一步观察:比如说答案在原串出现的位置分别为\(p_1, p_2, p_3... p_k\)(不妨设其严格升序),那么一定有\(\max (p_i - p_{i-1}) \leq length(ans)\)

你问我为什么?如果大于的话就接不上了啊...

然后我们发现,只要满足上面那两个条件,那这个串一定就是个合法串。于是我们把这套东西搬到失配树上:

  1. 这个串是n在树上的祖先
  2. 这个串在树上的子树里所有节点的max_gap \(\leq\) 这个串结尾的下标

问题就变成了怎么维护max_gap.

你发现这个东西维护最靠右边的1,最靠左边的1,答案就可以用线段树合并做到\(\mathcal{O(n log n)}\),但是发现空间有点爆炸。

于是发现,可选的串只在一条链上,所以可以先全加进去,然后再逐步删,就可以用线段树做到\(\mathcal{O(n log n)}\)时间,\(\mathcal{O(n)}\)空间了。

然后发现这根本不用线段树,因为是逐步删答案只会不断变大,双向链表就可以解决。所以复杂度是\(O(n)\)的。

猜你喜欢

转载自www.cnblogs.com/LiM-817/p/12343176.html
poi