【题解】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 的方案数就行了。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17971006,谢谢你的阅读或转载!