Skip to content

Commit 0061567

Browse files
committed
Improved task 3337
1 parent 3e57c6c commit 0061567

File tree

1 file changed

+48
-64
lines changed
  • src/main/kotlin/g3301_3400/s3337_total_characters_in_string_after_transformations_ii

1 file changed

+48
-64
lines changed
Lines changed: 48 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,74 @@
11
package g3301_3400.s3337_total_characters_in_string_after_transformations_ii
22

33
// #Hard #String #Hash_Table #Dynamic_Programming #Math #Counting
4-
// #2024_10_29_Time_320_ms_(100.00%)_Space_44_MB_(33.33%)
4+
// #2025_05_14_Time_302_ms_(100.00%)_Space_54.72_MB_(100.00%)
55

66
class Solution {
7-
fun lengthAfterTransformations(s: String, t: Int, nums: List<Int>): Int {
8-
val m = Array<IntArray>(26) { IntArray(26) }
9-
for (i in 0..25) {
10-
for (j in 1..nums[i]) {
11-
m[(i + j) % 26][i] = m[(i + j) % 26][i] + 1
12-
}
13-
}
14-
var v = IntArray(26)
7+
fun lengthAfterTransformations(s: String, t: Int, numsList: MutableList<Int>): Int {
8+
val localT = buildTransformationMatrix(numsList)
9+
val tPower = matrixPower(localT, t)
10+
val freq = IntArray(26)
1511
for (c in s.toCharArray()) {
16-
v[c.code - 'a'.code]++
12+
freq[c.code - 'a'.code]++
1713
}
18-
v = pow(m, v, t.toLong())
19-
var ans: Long = 0
20-
for (x in v) {
21-
ans += x.toLong()
14+
var result: Long = 0
15+
for (i in 0..25) {
16+
var sum: Long = 0
17+
for (j in 0..25) {
18+
sum = (sum + freq[j].toLong() * tPower[j][i]) % MOD
19+
}
20+
result = (result + sum) % MOD
2221
}
23-
return (ans % MOD).toInt()
22+
23+
return result.toInt()
2424
}
2525

26-
// A^e*v
27-
private fun pow(a: Array<IntArray>, v: IntArray, e: Long): IntArray {
28-
var v = v
29-
var e = e
30-
for (i in v.indices) {
31-
if (v[i] >= MOD) {
32-
v[i] %= MOD
33-
}
34-
}
35-
var mul = a
36-
while (e > 0) {
37-
if ((e and 1L) == 1L) {
38-
v = mul(mul, v)
26+
private fun buildTransformationMatrix(numsList: MutableList<Int>): Array<IntArray> {
27+
val localT = Array(26) { IntArray(26) }
28+
for (i in 0..25) {
29+
val steps: Int = numsList[i]
30+
for (j in 1..steps) {
31+
localT[i][(i + j) % 26] = localT[i][(i + j) % 26] + 1
3932
}
40-
mul = p2(mul)
41-
e = e ushr 1
4233
}
43-
return v
34+
return localT
4435
}
4536

46-
// int matrix*int vector
47-
private fun mul(a: Array<IntArray>, v: IntArray): IntArray {
48-
val m = a.size
49-
val n = v.size
50-
val w = IntArray(m)
51-
for (i in 0 until m) {
52-
var sum: Long = 0
53-
for (k in 0 until n) {
54-
sum += a[i][k].toLong() * v[k]
55-
if (sum >= BIG) {
56-
sum -= BIG
57-
}
37+
private fun matrixPower(matrix: Array<IntArray>, power: Int): Array<IntArray> {
38+
var matrix = matrix
39+
var power = power
40+
val size = matrix.size
41+
var result = Array(size) { IntArray(size) }
42+
for (i in 0..<size) {
43+
result[i][i] = 1
44+
}
45+
while (power > 0) {
46+
if ((power and 1) == 1) {
47+
result = multiplyMatrices(result, matrix)
5848
}
59-
w[i] = (sum % MOD).toInt()
49+
matrix = multiplyMatrices(matrix, matrix)
50+
power = power shr 1
6051
}
61-
return w
52+
return result
6253
}
6354

64-
// int matrix^2 (be careful about negative value)
65-
private fun p2(a: Array<IntArray>): Array<IntArray> {
66-
val n = a.size
67-
val c = Array<IntArray>(n) { IntArray(n) }
68-
for (i in 0 until n) {
69-
val sum = LongArray(n)
70-
for (k in 0 until n) {
71-
for (j in 0 until n) {
72-
sum[j] += a[i][k].toLong() * a[k][j]
73-
if (sum[j] >= BIG) {
74-
sum[j] -= BIG
75-
}
55+
private fun multiplyMatrices(a: Array<IntArray>, b: Array<IntArray>): Array<IntArray> {
56+
val size = a.size
57+
val result = Array(size) { IntArray(size) }
58+
for (i in 0..<size) {
59+
for (k in 0..<size) {
60+
if (a[i][k] == 0) {
61+
continue
62+
}
63+
for (j in 0..<size) {
64+
result[i][j] = ((result[i][j] + a[i][k].toLong() * b[k][j]) % MOD).toInt()
7665
}
77-
}
78-
for (j in 0 until n) {
79-
c[i][j] = (sum[j] % MOD).toInt()
8066
}
8167
}
82-
return c
68+
return result
8369
}
8470

8571
companion object {
86-
const val MOD: Int = 1000000007
87-
const val M2: Long = MOD.toLong() * MOD
88-
const val BIG: Long = 8L * M2
72+
private const val MOD = 1000000007
8973
}
9074
}

0 commit comments

Comments
 (0)