CSP-S2025
T3
赛时近 \(2h\),赛后 \(1h\)。
题意
看题面吧,值得说一下的是替换只能由至多一次,否则没法做了。
另外 $|t_1| \ne |t_2| $ 的情况是可能存在的,可能需特判,输出 \(0\)(纯出题人没事干。)
思路
讲一个自己想得做法。
令 \(len_i = |s_i|\), 假设我们把 \(t_1[r - len_i + 1, r]\) 替换位 \(s_1\)。替换后为 \(t_2\) 的充要条件是:
- \(lcp \ge r - len_i + 1\)
- \(lcs \ge |t_i| - r\)。
- \(s1 = t_1[r - len_i + 1, r]\)。
- \(s_2 = t_2[r - len_i + 1, r]\)。
可以枚举 \(r\),第一个条件化为 \(len_i \ge x\)。然后后面两个条件是一个多串匹配问题,使用 AC 自动机建出 fail 树后就是一个 dfs 序在一个区间里。是一个三维偏序,使用 cdq 分治可以达到 \(O(S \log^2 S)\)。
赛时想到这就卡住了,所以应该只有 \(60pts\)。(希望 CCF 机子好)
优化需要用到一个小 trick。可以将 \(s_1, s_2\) 插到一起(\(s1_0, s2_0, s1_1, s2_1, \dots\)),\(t_1, t_2\) 同理。这样后面两个条件就缩减成了一个,就是套路二维数点了。因为相对位置不变,所以是正确的。
时间复杂度 \(O(S \log S)\)。洛谷民间数据 \(1.4s\)。
赛时没有想到可以把 \(s1, s2\) 插到一起,所以是一个三维偏序。插到一起后少了一个条件就可以单 \(\log\) 做了。
还有 AC 自动机不要把 \(t_1,t_2\) 也插进去,只需要在 trie 上跑一次就行了,多了两倍常数,呃呃呃。
CCF 多久没考字符串呀???这个 trick 好久没用到了。
浙公网安备 33010602011771号