一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
The Fair Nut and Strings - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
二、解题报告
1、思路分析
我们把'a'看作0,'b'看作1,那么就得到了两个二进制数s和t
枚举所有前缀长度1~n,每一个前缀二进制数之差 + 1即为在[s, t]中该长度前缀的数目
注意Fair Nut只写了k个字符串,所以我们每次加前缀差+ 1和k当中小的那个
进一步得出,当枚举长度为i后,前缀差 + 1 >= k, 我们直接将答案加上k * (n - i - 1),然后跳出循环
否则高精度带来的复杂度无法承受
2、复杂度
时间复杂度: O(n)空间复杂度:O(n)
3、代码详解
n, k = map(int, input().split())
s = input()
t = input()
res = 0
diff = 0
for i in range(n):
diff = diff * 2 + (ord(t[i]) - ord(s[i]))
res += min(diff + 1, k)
if diff + 1 >= k:
res += (n - i - 1) * k
break
print(res)