← Home
For problem statement at 0-999/500-599/530-539/535/problemD.txt this is a correct solution, but verifier at 0-999/500-599/530-539/535/verifierD.go ends with all tests passed can you fix the verifier? ```go
package main

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

const MOD = 1000000007

func computeKMPFailure(p string) []int {
	m := len(p)
	fail := make([]int, m)
	fail[0] = 0
	j := 0
	for i := 1; i < m; i++ {
		for j > 0 && p[i] != p[j] {
			j = fail[j-1]
		}
		if p[i] == p[j] {
			j++
		}
		fail[i] = j
	}
	return fail
}

func checkOverlap(p string, overlap int) bool {
	lp := len(p)
	for i := 0; i < overlap; i++ {
		if p[lp-overlap+i] != p[i] {
			return false
		}
	}
	return true
}

func powMod(base, exp, mod int64) int64 {
	result := int64(1)
	base %= mod
	for exp > 0 {
		if exp%2 == 1 {
			result = result * base % mod
		}
		base = base * base % mod
		exp /= 2
	}
	return result
}

func main() {
	reader := bufio.NewReader(os.Stdin)

	var n, m int
	fmt.Fscan(reader, &n, &m)

	var p string
	fmt.Fscan(reader, &p)

	lp := len(p)

	positions := make([]int, m)
	for i := 0; i < m; i++ {
		fmt.Fscan(reader, &positions[i])
		positions[i]--
	}

	if m == 0 {
		ans := powMod(26, int64(n), MOD)
		fmt.Println(ans)
		return
	}

	for i := 0; i < m; i++ {
		if positions[i]+lp-1 >= n {
			fmt.Println(0)
			return
		}
	}

	z := make([]int, lp)
	z[0] = lp
	l, r := 0, 0
	for i := 1; i < lp; i++ {
		if i < r {
			z[i] = min(r-i, z[i-l])
		}
		for i+z[i] < lp && p[z[i]] == p[i+z[i]] {
			z[i]++
		}
		if i+z[i] > r {
			l, r = i, i+z[i]
		}
	}

	coveredEnd := positions[0] + lp
	valid := true

	for i := 1; i < m; i++ {
		pos := positions[i]
		if pos < coveredEnd {
			overlap := coveredEnd - pos
			if overlap > lp {
				valid = false
				break
			}
			startZ := lp - overlap
			if z[startZ] < overlap {
				valid = false
				break
			}
			newEnd := pos + lp
			if newEnd > coveredEnd {
				coveredEnd = newEnd
			}
		} else {
			coveredEnd = pos + lp
		}
	}

	if !valid {
		fmt.Println(0)
		return
	}

	covered := 0
	curStart := positions[0]
	curEnd := positions[0] + lp
	for i := 1; i < m; i++ {
		pos := positions[i]
		if pos < curEnd {
			if pos+lp > curEnd {
				curEnd = pos + lp
			}
		} else {
			covered += curEnd - curStart
			curStart = pos
			curEnd = pos + lp
		}
	}
	covered += curEnd - curStart

	free := n - covered
	ans := powMod(26, int64(free), MOD)
	fmt.Println(ans)
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
```