```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
scanInt := func() int {
scanner.Scan()
res, _ := strconv.Atoi(scanner.Text())
return res
}
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
k := scanInt()
length := scanInt()
A := make([]int, n+1)
for i := 1; i <= n; i++ {
A[i] = scanInt()
}
MOD := 998244353
dp := make([]int, (n+1)*(k+1))
S := make([]int, n+1)
S[0] = 1
max_len := make([]int, k+1)
for i := 1; i <= n; i++ {
for j := 1; j <= k; j++ {
if A[i] == -1 || A[i] == j {
max_len[j]++
} else {
max_len[j] = 0
}
}
for j := 1; j <= k; j++ {
idx := i*(k+1) + j
if A[i] == -1 || A[i] == j {
dp[idx] = S[i-1]
if max_len[j] >= length {
prev_idx := (i-length)*(k+1) + j
sub := S[i-length] - dp[prev_idx]
if sub < 0 {
sub += MOD
}
dp[idx] -= sub
if dp[idx] < 0 {
dp[idx] += MOD
}
}
} else {
dp[idx] = 0
}
S[i] = (S[i] + dp[idx])
if S[i] >= MOD {
S[i] -= MOD
}
}
}
fmt.Println(S[n])
}
```