Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type acamNode struct {11 son [26]*acamNode12 fail *acamNode13 fa *acamNode14 nodeID int15}16 17type gInfo struct{ l, r int }18 19type acam struct {20 root *acamNode21 nodeCnt int22 23 g [][]int24 gInfo []gInfo25 dfn int26}27 28func (t *acam) addEdge(v, w int) { t.g[v] = append(t.g[v], w) }29 30func (t *acam) put(s string) *acamNode {31 o := t.root32 for _, b := range s {33 b -= 'a'34 if o.son[b] == nil {35 o.son[b] = &acamNode{fa: o, nodeID: t.nodeCnt}36 t.nodeCnt++37 }38 o = o.son[b]39 }40 return o41}42 43func (t *acam) buildFail() {44 t.g = make([][]int, t.nodeCnt)45 t.root.fail = t.root46 q := make([]*acamNode, 0, t.nodeCnt)47 for i, son := range t.root.son[:] {48 if son == nil {49 t.root.son[i] = t.root50 } else {51 son.fail = t.root52 t.addEdge(son.fail.nodeID, son.nodeID)53 q = append(q, son)54 }55 }56 for len(q) > 0 {57 o := q[0]58 q = q[1:]59 f := o.fail60 for i, son := range o.son[:] {61 if son == nil {62 o.son[i] = f.son[i]63 continue64 }65 son.fail = f.son[i]66 t.addEdge(son.fail.nodeID, son.nodeID)67 q = append(q, son)68 }69 }70}71 72func (t *acam) buildDFN(v int) {73 t.dfn++74 t.gInfo[v].l = t.dfn75 for _, w := range t.g[v] {76 t.buildDFN(w)77 }78 t.gInfo[v].r = t.dfn79}80 81type fenwick47 []int82 83func (f fenwick47) update(i int) {84 for ; i < len(f); i += i & -i {85 f[i]++86 }87}88 89func (f fenwick47) pre(i int) (res int) {90 for ; i > 0; i &= i - 1 {91 res += f[i]92 }93 return94}95 96func (f fenwick47) query(l, r int) (res int) {97 return f.pre(r) - f.pre(l-1)98}99 100func CF547E(_r io.Reader, _w io.Writer) {101 in := bufio.NewReader(_r)102 out := bufio.NewWriter(_w)103 defer out.Flush()104 105 t := &acam{106 root: &acamNode{},107 nodeCnt: 1,108 }109 var n, q, l, r, k int110 var s string111 Fscan(in, &n, &q)112 a := make([]*acamNode, n+1)113 for i := 1; i <= n; i++ {114 Fscan(in, &s)115 a[i] = t.put(s)116 }117 t.buildFail()118 119 t.gInfo = make([]gInfo, len(t.g))120 t.buildDFN(t.root.nodeID)121 122 type query struct{ qid, k, sgn int }123 qs := make([][]query, n+1)124 for i := 0; i < q; i++ {125 Fscan(in, &l, &r, &k)126 qs[l-1] = append(qs[l-1], query{i, k, -1})127 qs[r] = append(qs[r], query{i, k, 1})128 }129 130 ans := make([]int, q)131 bit := make(fenwick47, t.nodeCnt+1)132 for i := 1; i <= n; i++ {133 for o := a[i]; o != t.root; o = o.fa {134 bit.update(t.gInfo[o.nodeID].l)135 }136 for _, q := range qs[i] {137 p := t.gInfo[a[q.k].nodeID]138 ans[q.qid] += q.sgn * bit.query(p.l, p.r)139 }140 }141 for _, v := range ans {142 Fprintln(out, v)143 }144}145 146147