题解 CF653F Paper task

这个题适合练习 SAM。

本质不同的子串有两种想法。一种是哈希,这里哈希很难判断括号串是否合法。还有一种是后缀数据结构,所以可以先用 SAM 将本质不同的子串搞出来。对于 SAM 上一个节点,就是一个以 $r$ 为结尾,$l$ 在一个区间内的所有子串。现在只用判断这些串是否都合法即可。

这不是难点。考虑从后往前看,遇到一个 ) 就使 $sum_i=sum_{i+1}+1$,遇到一个 ( 就使 $sum_i=sum_{i+1}-1$。这样一个子串 $s[l,\cdots,r]$ 合法当且仅当 $\forall i\in[l,r],sum_i\ge sum_{r+1}$ 且 $sum_l=sum_{r+1}$。那么我们预处理出 $pre_i$ 表示左边离 $i$ 最近的满足 $sum_j$ 值小于 $sum_i$ 的 $j$,查询时直接求左端点与 $pre_{r+1}$ 取 $\max$ 后的区间最小值和最小值出现次数即可,线段树维护。

时间复杂度 $O(n \log n)$。

posted @ 2023-07-03 21:42  Terac  阅读(4)  评论(0)    收藏  举报  来源