string

题目大意:
给出一个长度为n, 由小写英文字母组成的字符串S, 求在所有由小写英文字母组成且长度为n 且恰好有k 位与S 不同的字符串中,给定字符串T 按照字典序排在第几位。由于答案可能很大,模10^9 + 7 输出。

Input

第一行为两个整数n; k
第二行一个字符串S
第三行一个字符串T,(T即是k位与S不同的串)

Output

输出一行取模后的答案。

Sample Input

4 1
abcd
bbcd

Sample Output

76

Data Constraint

对于前30% 的数据,n<=5
对于100% 的数据,k<=n<=10^5

分析:
Subtask2: n ≤ 105
考虑由所有与 S 有 k 处不同的字符串组成的一棵 T rie, 只需要在 T rie 上走出 T 这个串,
然后统计每一步排在它之前的子树大小之和就可以了。
k 记录后 n − i + 1 位还需要与 S 不同的位数。对于第 i 位,前 i − 1 位与 T 相同,第 i
位是 c < T[i] 且 c ̸= S[i] 的字符串共有 (
n−i
k−1
)
· (|Σ| − 1)k−1 个,第 i 位是 c = S[i] 且 c < T[i]
的字符串共有 (
n−i
k
)
· (|Σ| − 1)k 个。若 S[i] ̸= T[i], 就将 k 减去 1,一直计算到字符串结束就可
以了。
复杂度 O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值