package q2976 import "math" const INF int = math.MaxInt func minimumCost(source string, target string, original []byte, changed []byte, cost []int) int64 { mat := make([][]int, 26) for i := range mat { mat[i] = make([]int, 26) mat[0][i] = INF } for i := 1; i < 26; i++ { copy(mat[i], mat[0]) } q := make([][3]int, 0, 2*len(original)) // src, dst, cost for i := range original { src, dst, cst := int(original[i]-'a'), int(changed[i]-'a'), cost[i] q = append(q, [3]int{src, dst, cst}) mat[src][dst] = min(mat[src][dst], cst) } for ; len(q) > 0; q = q[1:] { src, dst, cst := q[0][0], q[0][1], q[0][2] for next := range mat { if next == src || mat[dst][next] == INF { continue } nextCost := mat[dst][next] + cst if nextCost < mat[src][next] { mat[src][next] = nextCost q = append(q, [3]int{src, next, nextCost}) } } } minTotalCost := 0 for i := range len(source) { if source[i] != target[i] { src, dst := source[i]-'a', target[i]-'a' if mat[src][dst] == INF { return -1 } minTotalCost += mat[src][dst] } } return int64(minTotalCost) } var _ = minimumCost