← Home
```go
package main

import (
	"fmt"
	"io"
	"os"
	"strings"
)

func main() {
	input, _ := io.ReadAll(os.Stdin)
	lines := strings.Fields(string(input))
	if len(lines) < 3 {
		fmt.Println(0)
		return
	}
	t := lines[0]
	s1 := lines[1]
	s2 := lines[2]

	n := len(t)
	starts := make([]int, 0)
	for i := 0; i <= n-len(s1); i++ {
		if t[i:i+len(s1)] == s1 {
			starts = append(starts, i)
		}
	}

	ends := make([]int, 0)
	for i := 0; i <= n-len(s2); i++ {
		if t[i:i+len(s2)] == s2 {
			ends = append(ends, i)
		}
	}

	if len(starts) == 0 || len(ends) == 0 {
		fmt.Println(0)
		return
	}

	const m1 = 1000000007
	const m2 = 1000000009
	const b1 = 313
	const b2 = 317

	h1 := make([]uint64, n+1)
	h2 := make([]uint64, n+1)
	p1 := make([]uint64, n+1)
	p2 := make([]uint64, n+1)

	p1[0] = 1
	p2[0] = 1

	for i := 0; i < n; i++ {
		h1[i+1] = (h1[i]*b1 + uint64(t[i])) % m1
		h2[i+1] = (h2[i]*b2 + uint64(t[i])) % m2
		p1[i+1] = (p1[i] * b1) % m1
		p2[i+1] = (p2[i] * b2) % m2
	}

	type Hash struct {
		a, b uint64
	}

	seen := make(map[Hash]struct{})

	for _, i := range starts {
		for _, j := range ends {
			if j >= i && j+len(s2) >= i+len(s1) {
				length := j + len(s2) - i
				v1 := (h1[i+length] + m1 - (h1[i]*p1[length])%m1) % m1
				v2 := (h2[i+length] + m2 - (h2[i]*p2[length])%m2) % m2
				seen[Hash{v1, v2}] = struct{}{}
			}
		}
	}

	fmt.Println(len(seen))
}
```