CSP-S2019 括号树(栈,dfs,DP)
\(n\) 树,每个点上有 ( 或 ),问每个点从根走下来的路径上的括号序列里有多少子序列合法。\(1\le n \le 5 \times 10 ^ 5\)。
设 \(F_u\) 是最后 \(u\) 的答案,可以通过求出 \(f_u\) 表示后缀合法序列个数而获得。
如果 \(f_u \neq 0\),则 \(a_u =\) )。因为所有合法后缀必然基于一个最短合法后缀,所以可以求出 \(s_u\) 后缀最短的合法串转移。设最短合法后缀中 \(u\) 与 \(v\) 匹配,则 \(f_u = 1 + f(fa_v)\)。
求 \(v\) 需要维护一个栈,插入和删除都需要回溯。

浙公网安备 33010602011771号