Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6 "math"7 "slices"8 "strings"9)10 1112func cf467D(in io.Reader, out io.Writer) {13 var n, m, ts, ansR, ansSz int14 var s, t string15 Fscan(in, &n)16 a := make([]string, n)17 for i := range a {18 Fscan(in, &a[i])19 }20 Fscan(in, &m)21 idx := map[string]int{}22 type pair struct{ r, sz int }23 less := func(a, b pair) bool { return a.r < b.r || a.r == b.r && a.sz < b.sz }24 data := make([]pair, m*2)25 get := func(s string) int {26 s = strings.ToLower(s)27 if _, ok := idx[s]; !ok {28 data[len(idx)] = pair{strings.Count(s, "r"), len(s)}29 idx[s] = len(idx)30 }31 return idx[s]32 }33 g := make([][]int, m*2)34 for range m {35 Fscan(in, &s, &t)36 v, w := get(s), get(t)37 g[v] = append(g[v], w)38 }39 g = g[:len(idx)]40 41 allScc := [][]int{}42 dfn := make([]int, len(g))43 st := []int{}44 var tarjan func(int) int45 tarjan = func(v int) int {46 ts++47 dfn[v] = ts48 lowV := ts49 st = append(st, v)50 for _, w := range g[v] {51 if dfn[w] == 0 {52 lowW := tarjan(w)53 lowV = min(lowV, lowW)54 } else {55 lowV = min(lowV, dfn[w])56 }57 }58 if dfn[v] == lowV {59 scc := []int{}60 for {61 w := st[len(st)-1]62 st = st[:len(st)-1]63 dfn[w] = math.MaxInt64 scc = append(scc, w)65 if w == v {66 break67 }68 }69 allScc = append(allScc, scc)70 }71 return lowV72 }73 for i, t := range dfn {74 if t == 0 {75 tarjan(i)76 }77 }78 slices.Reverse(allScc)79 80 sid := make([]int, len(g))81 f := make([]pair, len(allScc))82 for i, scc := range allScc {83 mn := pair{1e9, 0}84 for _, v := range scc {85 sid[v] = i86 p := data[v]87 if less(p, mn) {88 mn = p89 }90 }91 f[i] = mn92 }93 g2 := make([][]int, len(allScc))94 deg := make([]int, len(allScc))95 for v, ws := range g {96 v = sid[v]97 for _, w := range ws {98 w = sid[w]99 if v != w {100 g2[w] = append(g2[w], v)101 deg[v]++102 }103 }104 }105 106 q := []int{}107 for i, d := range deg {108 if d == 0 {109 q = append(q, i)110 }111 }112 for len(q) > 0 {113 v := q[0]114 q = q[1:]115 for _, w := range g2[v] {116 if less(f[v], f[w]) {117 f[w] = f[v]118 }119 if deg[w]--; deg[w] == 0 {120 q = append(q, w)121 }122 }123 }124 125 for _, s := range a {126 s = strings.ToLower(s)127 if v, ok := idx[s]; ok {128 p := f[sid[v]]129 ansR += p.r130 ansSz += p.sz131 } else {132 ansR += strings.Count(s, "r")133 ansSz += len(s)134 }135 }136 Fprint(out, ansR, ansSz)137}138 139140