cf div2 1069 E1,E2 (概率,期望计算 & subtask 前缀和优化复杂度)
E1. Beautiful Patterns (Easy Version)
欲求:
设 \(X_{i,j}:\)
- 1 \(\rightarrow\) \(S_{i \backsim j}\) 是回文串
- 0 \(\rightarrow\) \(S_{i \backsim j}\) 不是回文串
将上式变形:
利用 “和的期望等于期望的和” 这一性质,把求和提到期望外面:
设 \(S_{1}=S_{i \backsim j}\),\(S_{2}=S_{k \backsim l}\)。\(S_{1},S_{2}\) 是 \(S\) 的任意子串。则只有 \(S_{1}\) 和 \(S_{2}\) 同时是回文串,才会对期望产生贡献。
考虑某个长度为 \(L\) 的字符串 \(S\) 是回文串的概率:显然前一半的形式会固定后一半的形式。因此概率为:
对于 \(S\) 中的 \(\forall\) 两个子串 \(S_{1}, S_{2}\),考虑它们同时是回文串的概率。这里需要分两种情况讨论:
- \(S_{1},S_{2}\) 同心:假设 \(S_{1}\) 较长,那么如果 \(S_{1}\) 是回文串,则 \(S_{2}\) 必然也是回文串。因此:
- \(S_{1},S_{2}\) 不同心:此时二者是否为回文串是相互独立的。因此:
容易发现,不考虑 \(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}\)
具体实现见代码。
E2. Beautiful Patterns (Hard Version)
需要一个 \(O(n)\) 线性做法,考虑对上面的方法优化:
我们完全考虑对 E1 中的代码进行重构,将重复计算的循环利用前缀和优化,进而逐步地完成 E2。
这里借鉴了这位 b 站 up 主的思路,看完后感觉真的受益匪浅,讲解优化的整个过程非常非常值得学习:link
整体优化的步骤见 code 部分,个人认为按照这套流程来做考察复杂度优化的 subtask 类型题应该是最不错的选择。

浙公网安备 33010602011771号