像潮落潮涌,送我奔向自由。|

寂静的海底

园龄:3年2个月粉丝:59关注:15

2023-06-27 14:02阅读: 10评论: 0推荐: 0

【题解】ABC301F | 计数

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

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

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

形如

(cnt?i)×(26cntupper)i_×26cnt?i

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

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

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

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

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

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

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

code

posted @   寂静的海底  阅读(10)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起