加载中...

cf div2 1069 E1,E2 (概率,期望计算 & subtask 前缀和优化复杂度)

E1. Beautiful Patterns (Easy Version)

欲求:

\[E[(回文子串数量)^{2}] \]

\(X_{i,j}:\)

  • 1 \(\rightarrow\) \(S_{i \backsim j}\) 是回文串
  • 0 \(\rightarrow\) \(S_{i \backsim j}\) 不是回文串

将上式变形:

\[= E((\sum_{i,j}X_{i,j})^{2}) \]

\[= E((\sum_{i,j}X_{i,j})*(\sum_{k,l}X_{k,l})) \]

利用 “和的期望等于期望的和” 这一性质,把求和提到期望外面:

\[= \sum_{i,j}\sum_{k,l}(E(X_{i,j}*X_{k,l})) \]

\(S_{1}=S_{i \backsim j}\)\(S_{2}=S_{k \backsim l}\)\(S_{1},S_{2}\)\(S\) 的任意子串。则只有 \(S_{1}\)\(S_{2}\) 同时是回文串,才会对期望产生贡献。

考虑某个长度为 \(L\) 的字符串 \(S\) 是回文串的概率:显然前一半的形式会固定后一半的形式。因此概率为:

\[P(S) = \frac{m^{\lceil\frac{L}{2}\rceil}}{m^{L}} = \frac{1}{m^{\lfloor\frac{L}{2}\rfloor}} \]

对于 \(S\) 中的 \(\forall\) 两个子串 \(S_{1}, S_{2}\),考虑它们同时是回文串的概率。这里需要分两种情况讨论:

  • \(S_{1},S_{2}\) 同心:假设 \(S_{1}\) 较长,那么如果 \(S_{1}\) 是回文串,则 \(S_{2}\) 必然也是回文串。因此:

\[P(S1 \wedge S2) = P(S1) \]

  • \(S_{1},S_{2}\) 不同心:此时二者是否为回文串是相互独立的。因此:

\[P(S1 \wedge S2) = P(S1) * P(S2) \]

容易发现,不考虑 \(S_{1},S_{2}\) 是否同心这一性质,上式的计算与 \(S_{1},S_{2}\) 的位置是无关的。因此我们可以枚举 \(S_{1}, S_{2}\) 的长度 \(len1, len2\),分别计算二者同心与不同心的期望并求和。

对于计算期望,可以用 “贡献 \(\times\) 概率” 这个定义式。其中贡献就是 \(S_{1},S_{2}\) 同时是回文串的方案数:长度为 \(len1\) 的子串共有 \(n - len1 + 1\) 种,长度为 \(len2\) 的子串共有 \(n - len2 + 1\) 种,因此总方案数就是 \((n - len1 + 1)*(n - len2 + 1)\),其中同心的方案数为 \(n - \max(len1,len2) + 1\) 种,并且要特别注意,只有 \(len1\)\(len2\) 奇偶性一致时才能同心!!!概率即 \(S_{1},S_{2}\) 均为回文串的概率,即:\(m^{\lfloor \frac{len1}{2} \rfloor} * m^{\lfloor \frac{len2}{2} \rfloor}\)

具体实现见代码。

code

E2. Beautiful Patterns (Hard Version)

需要一个 \(O(n)\) 线性做法,考虑对上面的方法优化:

我们完全考虑对 E1 中的代码进行重构,将重复计算的循环利用前缀和优化,进而逐步地完成 E2。

这里借鉴了这位 b 站 up 主的思路,看完后感觉真的受益匪浅,讲解优化的整个过程非常非常值得学习:link

整体优化的步骤见 code 部分,个人认为按照这套流程来做考察复杂度优化的 subtask 类型题应该是最不错的选择。

code

posted @ 2026-01-28 00:41  jxs123  阅读(5)  评论(0)    收藏  举报