← Home
For problem statement at 0-999/100-199/130-139/138/problemE.txt this is a correct solution, but verifier at 0-999/100-199/130-139/138/verifierE.go ends with All tests passed can you fix the verifier? ```go
package main

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

type Constraint struct {
	l, r int
}

func readString(in *bufio.Reader) string {
	var res []byte
	for {
		b, err := in.ReadByte()
		if err != nil {
			break
		}
		if b > 32 {
			res = append(res, b)
			break
		}
	}
	for {
		b, err := in.ReadByte()
		if err != nil || b <= 32 {
			break
		}
		res = append(res, b)
	}
	return string(res)
}

func readInt(in *bufio.Reader) int {
	var res int
	for {
		b, err := in.ReadByte()
		if err != nil {
			break
		}
		if b > 32 {
			res = int(b - '0')
			break
		}
	}
	for {
		b, err := in.ReadByte()
		if err != nil || b <= 32 {
			break
		}
		res = res*10 + int(b - '0')
	}
	return res
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	s := readString(in)
	if len(s) == 0 {
		return
	}
	k := readInt(in)
	L := readInt(in)
	R := readInt(in)

	constraints := make([][]Constraint, 26)
	for i := 0; i < k; i++ {
		cStr := readString(in)
		l := readInt(in)
		r := readInt(in)
		c := cStr[0] - 'a'
		constraints[c] = append(constraints[c], Constraint{l, r})
	}

	n := len(s)
	S := make([]byte, n+1)
	for i := 0; i < n; i++ {
		S[i+1] = s[i]
	}

	occ := make([][]int, 26)
	for i := 1; i <= n; i++ {
		c := S[i] - 'a'
		occ[c] = append(occ[c], i)
	}
	for c := 0; c < 26; c++ {
		occ[c] = append(occ[c], n+1)
	}

	diff := make([]int, n+2)
	for c := 0; c < 26; c++ {
		for _, cons := range constraints[c] {
			l, r := cons.l, cons.r
			start := 1
			if l > 0 {
				if l-1 < len(occ[c])-1 {
					start = occ[c][l-1]
				} else {
					start = n + 1
				}
			}
			end := n + 1
			if r < len(occ[c])-1 {
				end = occ[c][r]
			}
			if start < end {
				diff[start]++
				diff[end]--
			}
		}
	}

	count := make([]int, n+2)
	freq := make([]int, k+2)
	valid_substrings := 0

	for x := 1; x <= n; x++ {
		count[x] = count[x-1] + diff[x]
		freq[count[x]]++
		if L <= count[x] && count[x] <= R {
			valid_substrings++
		}
	}

	total_ans := int64(valid_substrings)
	pos_ptr := make([]int, 26)

	for i := 1; i < n; i++ {
		v := count[i]
		freq[v]--
		if L <= v && v <= R {
			valid_substrings--
		}

		char := S[i] - 'a'
		p := pos_ptr[char]

		for _, cons := range constraints[char] {
			l, r := cons.l, cons.r

			if l > 0 {
				start := n + 1
				if p+l-1 < len(occ[char])-1 {
					start = occ[char][p+l-1]
				}
				if start < i+1 {
					start = i + 1
				}
				end := n + 1
				if p+l < len(occ[char])-1 {
					end = occ[char][p+l]
				}
				for x := start; x < end; x++ {
					v := count[x]
					freq[v]--
					if L <= v && v <= R {
						valid_substrings--
					}
					count[x]--
					v--
					freq[v]++
					if L <= v && v <= R {
						valid_substrings++
					}
				}
			}

			start := n + 1
			if p+r < len(occ[char])-1 {
				start = occ[char][p+r]
			}
			if start < i+1 {
				start = i + 1
			}
			end := n + 1
			if p+r+1 < len(occ[char])-1 {
				end = occ[char][p+r+1]
			}
			for x := start; x < end; x++ {
				v := count[x]
				freq[v]--
				if L <= v && v <= R {
					valid_substrings--
				}
				count[x]++
				v++
				freq[v]++
				if L <= v && v <= R {
					valid_substrings++
				}
			}
		}

		pos_ptr[char]++
		total_ans += int64(valid_substrings)
	}

	fmt.Println(total_ans)
}
```