题解 P6000 [CEOI2016]match
FutaRimeWoawaSete · · 题解
考虑用经典的字符串匹配问题判断是否无解。因为递归到最内层必定存在两个相邻的括号挨在一起,可以证明用栈做的正确性是对的。
考虑分治解决问题,即我们对于一个形如区间
记
判断栈是否相等等价于判断两个长度相等的字符串是否相等,用哈希就可以做了。
考虑要找最远端点,那么我们不妨直接维护一个二元组信息
不难证明这个做法的时间复杂度上限是
考虑一些更能摊的方法,不难发现字符串中每个位置只会和另一个位置匹配,所以这里的匹配量是
若采用 vector 把所有链表存下来可以获得一个上限
设
若我们每次在递归解决问题时优先递归右区间并且将每层分治用到的二元组所对应的链表指针向前挪动,即按中-右-左的顺序遍历一棵区间拆分树可以保证后面遍历的区间使用到的信息一定不超过先前遍历的区间,即链表的指针不会向后挪回去。
那么我们可以得到所有链表的指针移动量为
如果精细实现的话可以去 map 做到