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权值计算/