← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

type State struct {
	cnt int64
	pre string
	suf string
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var t int
	if _, err := fmt.Fscan(in, &t); err != nil {
		return
	}

	for i := 0; i < t; i++ {
		var n int
		fmt.Fscan(in, &n)

		vars := make(map[string]State)
		var lastVar string

		for j := 0; j < n; j++ {
			var name, op string
			fmt.Fscan(in, &name, &op)
			lastVar = name

			if op == ":=" {
				var val string
				fmt.Fscan(in, &val)

				c := int64(0)
				for k := 0; k <= len(val)-4; k++ {
					if val[k:k+4] == "haha" {
						c++
					}
				}

				pre := val
				if len(pre) > 3 {
					pre = pre[:3]
				}
				suf := val
				if len(suf) > 3 {
					suf = suf[len(suf)-3:]
				}
				vars[name] = State{cnt: c, pre: pre, suf: suf}
			} else {
				var a, plus, b string
				fmt.Fscan(in, &a, &plus, &b)

				sA := vars[a]
				sB := vars[b]

				newCnt := sA.cnt + sB.cnt

				mid := sA.suf + sB.pre
				split := len(sA.suf)

				for k := 0; k <= len(mid)-4; k++ {
					if mid[k:k+4] == "haha" {
						if k < split && k+3 >= split {
							newCnt++
						}
					}
				}

				newPre := sA.pre
				if len(newPre) < 3 {
					newPre += sB.pre
					if len(newPre) > 3 {
						newPre = newPre[:3]
					}
				}

				newSuf := sB.suf
				if len(newSuf) < 3 {
					newSuf = sA.suf + newSuf
					if len(newSuf) > 3 {
						newSuf = newSuf[len(newSuf)-3:]
					}
				}

				vars[name] = State{cnt: newCnt, pre: newPre, suf: newSuf}
			}
		}
		fmt.Fprintln(out, vars[lastVar].cnt)
	}
}
```