标签:gap 先来 length order 严格 复杂 出现 就是 链表
先来观察答案的几个强性质。
首先答案肯定是原串的一个\(\tt{border}\),也就是失配树上的一条链。
再进一步观察:比如说答案在原串出现的位置分别为\(p_1, p_2, p_3... p_k\)(不妨设其严格升序),那么一定有\(\max (p_i - p_{i-1}) \leq length(ans)\)。
你问我为什么?如果大于的话就接不上了啊...
然后我们发现,只要满足上面那两个条件,那这个串一定就是个合法串。于是我们把这套东西搬到失配树上:
问题就变成了怎么维护max_gap.
你发现这个东西维护最靠右边的1,最靠左边的1,答案就可以用线段树合并做到\(\mathcal{O(n log n)}\),但是发现空间有点爆炸。
于是发现,可选的串只在一条链上,所以可以先全加进去,然后再逐步删,就可以用线段树做到\(\mathcal{O(n log n)}\)时间,\(\mathcal{O(n)}\)空间了。
然后发现这根本不用线段树,因为是逐步删答案只会不断变大,双向链表就可以解决。所以复杂度是\(O(n)\)的。
「POI 2005」SZA-Template 「失配树」「双向链表」「思维」
标签:gap 先来 length order 严格 复杂 出现 就是 链表
原文地址:https://www.cnblogs.com/LiM-817/p/12343176.html