```go
package main
import (
"bufio"
"fmt"
"os"
)
const (
M1 = 1000000007
M2 = 1000000009
P1 = 911382323
P2 = 972663749
)
func main() {
sc := bufio.NewScanner(os.Stdin)
sc.Buffer(make([]byte, 1024), 1024*1024)
sc.Split(bufio.ScanWords)
sc.Scan()
n := atoi(sc.Text())
sc.Scan()
k := atoi(sc.Text())
sc.Scan()
s := sc.Text()
sc.Scan()
g := atoi(sc.Text())
gameMap := make(map[[2]int64]int)
maxLen := 2 * n * k
pow1 := make([]int64, maxLen+1)
pow2 := make([]int64, maxLen+1)
pow1[0] = 1
pow2[0] = 1
for i := 1; i <= maxLen; i++ {
pow1[i] = (pow1[i-1] * P1) % M1
pow2[i] = (pow2[i-1] * P2) % M2
}
for i := 0; i < g; i++ {
sc.Scan()
name := sc.Text()
h1, h2 := int64(0), int64(0)
for j := 0; j < k; j++ {
c := int64(name[j] - 'a' + 1)
h1 = (h1*P1 + c) % M1
h2 = (h2*P2 + c) % M2
}
gameMap[[2]int64{h1, h2}] = i + 1
}
t := s + s
L := len(t)
pref1 := make([]int64, L+1)
pref2 := make([]int64, L+1)
for i := 0; i < L; i++ {
c := int64(t[i] - 'a' + 1)
pref1[i+1] = (pref1[i]*P1 + c) % M1
pref2[i+1] = (pref2[i]*P2 + c) % M2
}
getHash := func(l, r int) [2]int64 {
x1 := (pref1[r] - pref1[l]*pow1[r-l]%M1 + M1) % M1
x2 := (pref2[r] - pref2[l]*pow2[r-l]%M2 + M2) % M2
return [2]int64{x1, x2}
}
lastSeen := make([]int, g+1)
curIter := 0
ans := make([]int, n)
for d := 0; d < k; d++ {
curIter++
valid := true
for i := 0; i < n; i++ {
pos := d + i*k
h := getHash(pos, pos+k)
id, ok := gameMap[h]
if !ok {
valid = false
break
}
if lastSeen[id] == curIter {
valid = false
break
}
lastSeen[id] = curIter
ans[i] = id
}
if valid {
fmt.Println("YES")
for i := 0; i < n; i++ {
if i > 0 {
fmt.Print(" ")
}
fmt.Print(ans[i])
}
fmt.Println()
return
}
}
fmt.Println("NO")
}
func atoi(s string) int {
v := 0
for i := 0; i < len(s); i++ {
v = v*10 + int(s[i]-'0')
}
return v
}
```