← Home
```go
package main

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

func main() {
	// Configure scanner to read space-delimited tokens (words)
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	// Increase buffer size to handle the maximum string length constraint (10^5)
	const maxCapacity = 200000
	buf := make([]byte, maxCapacity)
	scanner.Buffer(buf, maxCapacity)

	// Read string s
	if !scanner.Scan() {
		return
	}
	s := scanner.Text()

	// Read integer n
	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	// Read n boring strings
	boring := make([]string, n)
	for i := 0; i < n; i++ {
		if scanner.Scan() {
			boring[i] = scanner.Text()
		}
	}

	ls := len(s)
	// limit[i] will store the minimum end index (exclusive) of a boring string 
	// that starts exactly at index i.
	// Initialize with ls + 1 (representing infinity/no constraint).
	limit := make([]int, ls+1)
	for i := 0; i <= ls; i++ {
		limit[i] = ls + 1
	}

	// Find all occurrences of each boring string and update limit array
	for _, b := range boring {
		lb := len(b)
		if lb > ls {
			continue
		}
		// Check every position in s where b fits
		for i := 0; i <= ls-lb; i++ {
			if s[i:i+lb] == b {
				end := i + lb
				if end < limit[i] {
					limit[i] = end
				}
			}
		}
	}

	// suffixMin[i] will store the minimum end index of any boring string 
	// that starts at or after index i.
	// This helps in determining the rightmost boundary for a substring starting at i.
	suffixMin := make([]int, ls+1)
	minEnd := ls + 1
	for i := ls; i >= 0; i-- {
		if limit[i] < minEnd {
			minEnd = limit[i]
		}
		suffixMin[i] = minEnd
	}

	maxLen := 0
	bestPos := 0

	// Iterate through all possible start positions i
	for i := 0; i < ls; i++ {
		// A substring starting at i is valid if it doesn't fully contain any boring string.
		// If a boring string is at [p, q) (where p >= i), our substring [i, R) contains it if R >= q.
		// To be valid, we must have R < q for all boring strings with start p >= i.
		// Thus, the maximum valid R (exclusive) is min(q) - 1, where min(q) is suffixMin[i].
		
		validEnd := suffixMin[i] - 1
		
		// The substring cannot extend beyond the original string s
		if validEnd > ls {
			validEnd = ls
		}

		length := validEnd - i
		
		// Keep track of the longest valid substring found.
		// Using strict inequality ensures we keep the first position in case of ties.
		if length > maxLen {
			maxLen = length
			bestPos = i
		}
	}

	fmt.Println(maxLen, bestPos)
}
```