229小U的chi权值计算
问题描述
给定一个由字符'c'、'h'、'i'、'?'组成的字符串,其中'?'可以替换为'c'、'h'或'i'。定义字符串的权值基于所有字符'h'的位置计算。对于每个'h',其前面的'c'和后面的'i'都会对其贡献 1 的权值。求所有可能替换方案的权值之和,结果对 (10^9 + 7) 取模。
解题思路
- 统计未知字符:首先统计字符串中
?的总数,用cnt表示。 - 前缀计数:
prec记录当前位置前面的c数量。pre记录前面?的数量。
- 后缀计数:
sufi记录当前位置后面的i数量。suf记录后面?的数量。
- 遍历字符串:
- 对于每个字符:
- 如果是
c,则增加prec。 - 如果是
i,则减少sufi。 - 如果是
h,计算其贡献:- 固定
h的贡献为prec + sufi,乘以当前?的排列组合数。每个?都可以替换成c、h、i这三种字符,所以总共的替换方案为pow(3, cnt, mod)。因此前面的c和i的贡献为pow(3, cnt, mod) * (prec + sufi)。 - 考虑前面的
?替换为c和后面的?替换为i的情况。前面的?替换成c也有贡献,一个?在pow(3, cnt - 1, mod)种情况下可以替换成c,而当前位置前面共有pre个?,所以前面的?的贡献为pre * pow(3, cnt - 1, mod)。后面的?同理为suf * pow(3, cnt - 1, mod)。
- 固定
- 如果是
?,考虑其替换为h的情况,类似地计算贡献,并更新pre和suf。当前的?已经替换成了h,所以后面的?的贡献为suf * pow(3, cnt - 2, mod)。前面的?同理为pre * pow(3, cnt - 2, mod)。
- 如果是
- 对于每个字符:
- 取模:最终结果对 (10^9 + 7) 取模。
代码实现
1 | |
复杂度分析
- 时间复杂度:(O(n)),其中(n)是字符串的长度。(实现中可以预处理快速幂的结果,使每步计算都是(O(1))的时间复杂度)
- 空间复杂度:(O(1)),只使用了常数额外空间。
229小U的chi权值计算
https://kongshuilinhua.github.io/2024/12/27/229小U的chi权值计算/