diff --git a/solution/3300-3399/3337.Total Characters in String After Transformations II/README.md b/solution/3300-3399/3337.Total Characters in String After Transformations II/README.md index 0cfe618ae042a..2203cfb060dcd 100644 --- a/solution/3300-3399/3337.Total Characters in String After Transformations II/README.md +++ b/solution/3300-3399/3337.Total Characters in String After Transformations II/README.md @@ -130,13 +130,122 @@ tags: #### Python3 ```python - +class Solution: + def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int: + mod = 10**9 + 7 + m = 26 + + cnt = [0] * m + for c in s: + cnt[ord(c) - ord("a")] += 1 + + matrix = [[0] * m for _ in range(m)] + for i, x in enumerate(nums): + for j in range(1, x + 1): + matrix[i][(i + j) % m] = 1 + + def matmul(a: List[List[int]], b: List[List[int]]) -> List[List[int]]: + n, p, q = len(a), len(b), len(b[0]) + res = [[0] * q for _ in range(n)] + for i in range(n): + for k in range(p): + if a[i][k]: + for j in range(q): + res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod + return res + + def matpow(mat: List[List[int]], power: int) -> List[List[int]]: + res = [[int(i == j) for j in range(m)] for i in range(m)] + while power: + if power % 2: + res = matmul(res, mat) + mat = matmul(mat, mat) + power //= 2 + return res + + cnt = [cnt] + factor = matpow(matrix, t) + result = matmul(cnt, factor)[0] + + ans = sum(result) % mod + return ans ``` #### Java ```java - +class Solution { + private final int mod = (int) 1e9 + 7; + + public int lengthAfterTransformations(String s, int t, List nums) { + final int m = 26; + + int[] cnt = new int[m]; + for (char c : s.toCharArray()) { + cnt[c - 'a']++; + } + + int[][] matrix = new int[m][m]; + for (int i = 0; i < m; i++) { + int num = nums.get(i); + for (int j = 1; j <= num; j++) { + matrix[i][(i + j) % m] = 1; + } + } + + int[][] factor = matpow(matrix, t, m); + int[] result = vectorMatrixMultiply(cnt, factor); + int ans = 0; + for (int val : result) { + ans = (ans + val) % mod; + } + return ans; + } + + private int[][] matmul(int[][] a, int[][] b) { + int n = a.length; + int p = b.length; + int q = b[0].length; + int[][] res = new int[n][q]; + for (int i = 0; i < n; i++) { + for (int k = 0; k < p; k++) { + if (a[i][k] == 0) continue; + for (int j = 0; j < q; j++) { + res[i][j] = (int) ((res[i][j] + 1L * a[i][k] * b[k][j]) % mod); + } + } + } + return res; + } + + private int[][] matpow(int[][] mat, int power, int m) { + int[][] res = new int[m][m]; + for (int i = 0; i < m; i++) { + res[i][i] = 1; + } + while (power > 0) { + if ((power & 1) != 0) { + res = matmul(res, mat); + } + mat = matmul(mat, mat); + power >>= 1; + } + return res; + } + + private int[] vectorMatrixMultiply(int[] vector, int[][] matrix) { + int n = matrix.length; + int[] result = new int[n]; + for (int i = 0; i < n; i++) { + long sum = 0; + for (int j = 0; j < n; j++) { + sum = (sum + 1L * vector[j] * matrix[j][i]) % mod; + } + result[i] = (int) sum; + } + return result; + } +} ``` #### C++ diff --git a/solution/3300-3399/3337.Total Characters in String After Transformations II/README_EN.md b/solution/3300-3399/3337.Total Characters in String After Transformations II/README_EN.md index 8088af730786c..720268c83f2c2 100644 --- a/solution/3300-3399/3337.Total Characters in String After Transformations II/README_EN.md +++ b/solution/3300-3399/3337.Total Characters in String After Transformations II/README_EN.md @@ -127,13 +127,122 @@ tags: #### Python3 ```python - +class Solution: + def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int: + mod = 10**9 + 7 + m = 26 + + cnt = [0] * m + for c in s: + cnt[ord(c) - ord("a")] += 1 + + matrix = [[0] * m for _ in range(m)] + for i, x in enumerate(nums): + for j in range(1, x + 1): + matrix[i][(i + j) % m] = 1 + + def matmul(a: List[List[int]], b: List[List[int]]) -> List[List[int]]: + n, p, q = len(a), len(b), len(b[0]) + res = [[0] * q for _ in range(n)] + for i in range(n): + for k in range(p): + if a[i][k]: + for j in range(q): + res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod + return res + + def matpow(mat: List[List[int]], power: int) -> List[List[int]]: + res = [[int(i == j) for j in range(m)] for i in range(m)] + while power: + if power % 2: + res = matmul(res, mat) + mat = matmul(mat, mat) + power //= 2 + return res + + cnt = [cnt] + factor = matpow(matrix, t) + result = matmul(cnt, factor)[0] + + ans = sum(result) % mod + return ans ``` #### Java ```java - +class Solution { + private final int mod = (int) 1e9 + 7; + + public int lengthAfterTransformations(String s, int t, List nums) { + final int m = 26; + + int[] cnt = new int[m]; + for (char c : s.toCharArray()) { + cnt[c - 'a']++; + } + + int[][] matrix = new int[m][m]; + for (int i = 0; i < m; i++) { + int num = nums.get(i); + for (int j = 1; j <= num; j++) { + matrix[i][(i + j) % m] = 1; + } + } + + int[][] factor = matpow(matrix, t, m); + int[] result = vectorMatrixMultiply(cnt, factor); + int ans = 0; + for (int val : result) { + ans = (ans + val) % mod; + } + return ans; + } + + private int[][] matmul(int[][] a, int[][] b) { + int n = a.length; + int p = b.length; + int q = b[0].length; + int[][] res = new int[n][q]; + for (int i = 0; i < n; i++) { + for (int k = 0; k < p; k++) { + if (a[i][k] == 0) continue; + for (int j = 0; j < q; j++) { + res[i][j] = (int) ((res[i][j] + 1L * a[i][k] * b[k][j]) % mod); + } + } + } + return res; + } + + private int[][] matpow(int[][] mat, int power, int m) { + int[][] res = new int[m][m]; + for (int i = 0; i < m; i++) { + res[i][i] = 1; + } + while (power > 0) { + if ((power & 1) != 0) { + res = matmul(res, mat); + } + mat = matmul(mat, mat); + power >>= 1; + } + return res; + } + + private int[] vectorMatrixMultiply(int[] vector, int[][] matrix) { + int n = matrix.length; + int[] result = new int[n]; + for (int i = 0; i < n; i++) { + long sum = 0; + for (int j = 0; j < n; j++) { + sum = (sum + 1L * vector[j] * matrix[j][i]) % mod; + } + result[i] = (int) sum; + } + return result; + } +} ``` #### C++ diff --git a/solution/3300-3399/3337.Total Characters in String After Transformations II/Solution.java b/solution/3300-3399/3337.Total Characters in String After Transformations II/Solution.java new file mode 100644 index 0000000000000..78a7ac32bff20 --- /dev/null +++ b/solution/3300-3399/3337.Total Characters in String After Transformations II/Solution.java @@ -0,0 +1,72 @@ +class Solution { + private final int mod = (int) 1e9 + 7; + + public int lengthAfterTransformations(String s, int t, List nums) { + final int m = 26; + + int[] cnt = new int[m]; + for (char c : s.toCharArray()) { + cnt[c - 'a']++; + } + + int[][] matrix = new int[m][m]; + for (int i = 0; i < m; i++) { + int num = nums.get(i); + for (int j = 1; j <= num; j++) { + matrix[i][(i + j) % m] = 1; + } + } + + int[][] factor = matpow(matrix, t, m); + int[] result = vectorMatrixMultiply(cnt, factor); + int ans = 0; + for (int val : result) { + ans = (ans + val) % mod; + } + return ans; + } + + private int[][] matmul(int[][] a, int[][] b) { + int n = a.length; + int p = b.length; + int q = b[0].length; + int[][] res = new int[n][q]; + for (int i = 0; i < n; i++) { + for (int k = 0; k < p; k++) { + if (a[i][k] == 0) continue; + for (int j = 0; j < q; j++) { + res[i][j] = (int) ((res[i][j] + 1L * a[i][k] * b[k][j]) % mod); + } + } + } + return res; + } + + private int[][] matpow(int[][] mat, int power, int m) { + int[][] res = new int[m][m]; + for (int i = 0; i < m; i++) { + res[i][i] = 1; + } + while (power > 0) { + if ((power & 1) != 0) { + res = matmul(res, mat); + } + mat = matmul(mat, mat); + power >>= 1; + } + return res; + } + + private int[] vectorMatrixMultiply(int[] vector, int[][] matrix) { + int n = matrix.length; + int[] result = new int[n]; + for (int i = 0; i < n; i++) { + long sum = 0; + for (int j = 0; j < n; j++) { + sum = (sum + 1L * vector[j] * matrix[j][i]) % mod; + } + result[i] = (int) sum; + } + return result; + } +} diff --git a/solution/3300-3399/3337.Total Characters in String After Transformations II/Solution.py b/solution/3300-3399/3337.Total Characters in String After Transformations II/Solution.py new file mode 100644 index 0000000000000..47a98571b45a2 --- /dev/null +++ b/solution/3300-3399/3337.Total Characters in String After Transformations II/Solution.py @@ -0,0 +1,39 @@ +class Solution: + def lengthAfterTransformations(self, s: str, t: int, nums: List[int]) -> int: + mod = 10**9 + 7 + m = 26 + + cnt = [0] * m + for c in s: + cnt[ord(c) - ord("a")] += 1 + + matrix = [[0] * m for _ in range(m)] + for i, x in enumerate(nums): + for j in range(1, x + 1): + matrix[i][(i + j) % m] = 1 + + def matmul(a: List[List[int]], b: List[List[int]]) -> List[List[int]]: + n, p, q = len(a), len(b), len(b[0]) + res = [[0] * q for _ in range(n)] + for i in range(n): + for k in range(p): + if a[i][k]: + for j in range(q): + res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod + return res + + def matpow(mat: List[List[int]], power: int) -> List[List[int]]: + res = [[int(i == j) for j in range(m)] for i in range(m)] + while power: + if power % 2: + res = matmul(res, mat) + mat = matmul(mat, mat) + power //= 2 + return res + + cnt = [cnt] + factor = matpow(matrix, t) + result = matmul(cnt, factor)[0] + + ans = sum(result) % mod + return ans