LC 3337. 字符串转换后的长度 II
https://leetcode.cn/problems/total-characters-in-string-after-transformations-ii/description/
直接使用最初的版本不太好使 https://leetcode.cn/problems/total-characters-in-string-after-transformations-i/description/ 是因为简化版本的T有点小。
本质上是对一个数组不断地进行某种特定的变化,所以可以写成矩阵乘法的形式,然后矩阵可以快速求幂。
class Solution:
def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int:
cnt = [[0] for _ in range(26)]
for c in s:
i = ord(c) - ord('a')
cnt[i][0] += 1
MOD = 10 ** 9 + 7
T = [[0] * 26 for _ in range(26)]
for i in range(26):
rep = nums[i]
for j in range(rep):
T[(i + j + 1) % 26][i] = 1
# print(cnt, T)
def mat_mul(a, b, MOD):
R, K, C = len(a), len(a[0]), len(b[0])
res = [[0] * C for _ in range(R)]
for k in range(K):
for i in range(R):
for j in range(C):
res[i][j] += (a[i][k] * b[k][j]) % MOD
res[i][j] %= MOD
return res
def mat_pow(a, b, MOD):
assert (len(a) == len(a[0]))
d = len(a)
ans = [[0] * d for _ in range(d)]
for i in range(d):
ans[i][i] = 1
while b:
if b & 0x1:
ans = mat_mul(a, ans, MOD)
a = mat_mul(a, a, MOD)
b = b >> 1
return ans
T2 = mat_pow(T, t, MOD)
R = mat_mul(T2, cnt, MOD)
ans = 0
for i in range(26):
ans += R[i][0]
return ans % MOD