2025 CSP-S 补题笔记

T1

CCF 你是人!这么爱考贪心。
去年 NOIP 就因为贪心挂到 40 pts。
但好在这次看到 \(\frac{n}{2}\),立刻就想到艾米娅家的饭,于是 20min 就场切了。

T2

一眼性质,然后写了个 80pts 的暴力,算了算复杂度好像过不了,瓶颈在排序,于是想到折半预处理,我写写写,终于在 2.5h 的时候通过了本题。回家后看了题解-我 tm 真是 sb,为啥要写折半,直接一开始排一边就完了。

T3

只有 25 pts。

首先有性质:
如果字符串 \(t_1\) 能通过 \(s_1,s_2\) 替换形成 \(t_2\),那么必然 \(t_1,t_2\)恰好不同串,与 \(s_1,s_2\)恰好不同串 是相同的。

因此我们可以将 \(s_1,s_2\) 按它的两个恰好不同串的哈希值分类。

除了恰好不同串相同的限制,还有一条限制:\(s_1\) 恰好不同串左边的串必然是 \(t_1\) 恰好不同串左边串的后缀,\(s_1\) 恰好不同串右边的串必然是 \(t_1\) 恰好不同串左边串的前缀。

于是我们可以对一类 \(s_1,s_2\) 建一棵后缀 Trie 树存储相同的左串,以及一棵前缀 Trie 树存储相同的右串。对于一组询问 \(t_1,t_2\) 设他们的相同的左串在后缀 Trie 树上最远能走到 \(u_1\),他们的相同的右串在前缀 Trie 树上最远能走到 \(u_2\)

于是问题就转化为了有多少组 \(s_1,s_2\) 他们相同的左串结束点为 \(v_1\),右串结束点为 \(v_2\),满足 \(v_1\)\(u_1\) 的祖先,\(v_2\)\(u_2\) 的祖先。

对于这种二维偏序类问题,考虑扫描线。

对于每组询问先处理出 \(u_1,u_2\),并在对应的后缀 Trie 树 \(u_1\) 上打上标记。扫后缀 Trie 树,假设当前扫到了 \(u\) 点,就将其在前缀 Trie 树上对应的 \(v\) 点的子树都加 \(1\)(只会对子树内的点有贡献)。每次在后缀树上遇到一个询问标记,就查他在前缀树上的对应点的值(树状数组维护即可)

posted @ 2025-11-03 09:42  GuoSN0410  阅读(10)  评论(0)    收藏  举报