← Home
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])
}