题解:CF631D Messenger

题意是统计字符串 \(t\) 在字符串 \(s\) 中的出现次数,它们以块 \((\ell,c)\) 形式给出。先把相邻且字符相同的块合并成极大块序列,设合并后 \(s\)\(n\) 块、\(t\)\(m\) 块。

\(m=1\),模式仅一块 \((b_1,c_1)\)。它能放进 \(s\) 的某块 \((a_i,c_i)\) 的位置数为 \(a_i-b_1+1\),前提是 \(c_i=c_1\)\(a_i\ge b_1\),累加即得答案。

\(m=2\),只需扫一遍相邻块对 \((a_i,c_i),(a_{i+1},c_{i+1})\),当 \(c_i=c_1,\;c_{i+1}=c_2,\;a_i\ge b_1,\;a_{i+1}\ge b_2\) 时出现一次。

\(m\ge3\) 时,把首尾两块单独比较,核心是中间 \(m-2\) 块序列。该序列要求在 \(s\) 的块序列中逐块完全对应,于是用 KMP 在 \(O(n+m)\) 时间匹配。每匹配成功一次,再检查核心左侧块与右侧块是否满足 \(c_{\text{左}}=c_1,\;c_{\text{右}}=c_m,\;a_{\text{左}}\ge b_1,\;a_{\text{右}}\ge b_m\),满足即计数。

时间复杂度 \(O(n+m)\)

link

posted @ 2025-06-26 11:23  薛儒浩  阅读(14)  评论(0)    收藏  举报