CF1093F
#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; }