CSP-S2025

T3

赛时近 \(2h\),赛后 \(1h\)

洛谷 P14363

题意

看题面吧,值得说一下的是替换只能由至多一次,否则没法做了。

另外 $|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 好久没用到了。

posted @ 2025-11-02 22:37  xiehanrui0817  阅读(12)  评论(0)    收藏  举报