#include<bits/stdc++.h>
using namespace std;
const int N=1e5+20;
const int mod=998244353;
int a[N];
int n;
int k,len;
int dp[N][118];
//设dp[i][j]为考虑前i个位置,第i个位置填j的方案数
//非-1的状态不能改变,置0
//这样的话dp[i][]就都是由s[i-1]转移过来的
int s[N],l[N];
//s_i表示和,sigma j~k的dp[i][j]
//l填往前 相同的 最长长度
int main()
{
ios::sync_with_stdio(false);
cin>>n;
cin>>k>>len;
for(int i=1;i<=n;i++)
cin>>a[i];
//当l小于len的时候由si-1直接转移
s[0]=1;
//初始的话只能是1
for(int i=1;i<=n;i++)
{
if(a[i]==-1)
{
//当前位置什么都能填
for(int j=1;j<=k;j++)
l[j]++;
}
else
{
for(int j=1;j<=k;j++)
{//当前位置本数可以叠一个长度
if(a[i]==j)
l[j]++;
else
l[j]=0;
//其他数字叠的长度归0
}
}
if(a[i]>=0)
{
int f=a[i];
if(l[f]<len)
dp[i][f]=s[i-1];
else
dp[i][f]=((s[i-1]-s[i-len]+mod)%mod+dp[i-len][f])%mod;
s[i]=dp[i][f];
}
else
{
for(int j=1;j<=k;j++)
{
if(l[j]<len)
dp[i][j]=s[i-1];
else
dp[i][j]=((s[i-1]-s[i-len]+mod)%mod+dp[i-len][j])%mod;
s[i]=(s[i]+dp[i][j])%mod;
}
}
}
cout<<s[n];
return 0;
}