【题解】ABC301F | 计数

不需要 dp,$O(n|S|)$。

枚举出现的第一个 DD 的位置。并计算后面没有 oS 的方案数。

如果我们钦定 DD 后面的 D 出现在 $i$ 位置,我们只需要知道前面“?” 的个数 和 大写字母的个数,就可以算出。前面 不出现重复的大写字母,且出现过一个 和这个字母相同的字母的方案数。

形如

$$ \sum \binom{cnt?}{i} \times (26-cntupper) ^{\underline {i}}\times26^{cnt?-i} $$

$cnt?$ 表示“?” 个数,$cntupper$ 表示已经出现的大写字母种类数。

如果要钦定之前出现过某一种字符的话减去 没有出现过就行。

注意我们只区分这个“?” 代表的字母之前是否出现过,所以不用枚举字母,只需要知道前面出现过和没出现过的字母个数。

那么没有出现 oS 的怎么算呢?

一个字符串没有 oS 子序列那么它一定形如 $\texttt{SSSSS......ooooo}$,即一段前缀 S 和一段后缀 o。

又因为大写字母和小写字母的种类数是相同的,也就是说对于不同的分界点来说,可行的选择数是相同的,均为 $26^{cnt?}$ 种,所以只用考虑合法的分界点数,即 DD 后的最后一个 S 到第一个 O 之间的位置。

最后再加上整个串没有 DD 的方案数就行了。

code

posted @ 2023-06-27 14:02  寂静的海底  阅读(7)  评论(0编辑  收藏  举报  来源