#include <iostream>
#include<vector>
#include<string>
//#pragma GCC optimize("O3")
#pragma GCC target("avx2,popcnt")
using namespace std;
#define int long long
const int mod = 998244353;
void solve(){
    int n,m,k;
    cin >> n >> m >> k;
    string w;
    cin>>w;
if(n==m&&n==k){cout << 1; return;}
    int wmask = 0;
    for(int i = (int)w.size()-1; i >= 0; i--){
        wmask = 2*wmask + (w[i]-'0');
    }
    vector<int> dp1(1ll<<(1ll<<(k+1)),0);
    if(n>k) {
        for (int allowed = 0; allowed < (1ll << (1ll << (k + 1))); ++allowed) {
            vector<vector<int>> dp(n, vector<int>(1ll << (k + 1), 0));
            for (int mask = 0; mask < (1ll << (k + 1)); ++mask) {
                if ((allowed >> mask) & 1) {
                    dp[k][mask] = 1;
                }
            }
            for (int i = k + 1; i < n; ++i) {
                for (int mask = 0; mask < (1ll << (k + 1)); ++mask) {
                    if ((allowed >> mask) & 1) {
                        for (int aaa = 0; aaa < 2; ++aaa) {
                            dp[i][mask] = (dp[i][mask] + dp[i - 1][(1ll << k) * aaa + (mask >> 1)]) % mod;
                        }
                    }
                }
            }
            dp1[allowed] = 0;
            for (int mask = 0; mask < (1ll << (k + 1)); ++mask) {
                dp1[allowed] = (dp1[allowed] + dp[n - 1][mask]) % mod;
            }
        }
    }
    else{
        for(int first = 0; first < (1ll<<(1ll<<(k+1)));++first) {
            bool contain = false;
            if ((first >> wmask) & 1) contain = true;
            if ((first >> (wmask + (1ll << k))) & 1) contain = true;
            if ((first >> (wmask * 2)) & 1) contain = true;
            if ((first >> (wmask * 2 + 1)) & 1) contain = true;
            if(contain) dp1[first]=1;
            else dp1[first] = 0;
        }
    }
    vector<int> strict1(1ll<<(1ll<<(k+1)));
    for(int allowed = 0; allowed< (1ll<<(1ll<<(k+1))); ++allowed){
        vector<int>ind;
        for(int i = 0; i < (1ll<<(k+1)); ++i){
            if((allowed>>i)&1) ind.push_back(i);
        }
        strict1[allowed] = 0;
        for(int mask= 0; mask < (1ll<<ind.size()); ++mask){

            int newmask = allowed;
            for(int i=0; i < ind.size(); ++i){
                if((mask>>i)&1){
                    newmask -= (1ll<<ind[i]);
                }
            }
            if(__builtin_popcount(mask) %2 == 0){
                strict1[allowed] = (strict1[allowed] + dp1[newmask])%mod;
            }
            else {
                strict1[allowed] = (strict1[allowed] +mod -dp1[newmask])%mod;
            }

        }
    }
    vector<int> dp2(1ll<<(1ll<<(k+1)));
    if(m>k) {
        for (int allowed = 0; allowed < (1ll << (1ll << (k + 1))); ++allowed) {
            vector<vector<int>> dp(m, vector<int>(1ll << (k + 1), 0));
            for (int mask = 0; mask < (1ll << (k + 1)); ++mask) {
                if ((allowed >> mask) & 1) {
                    dp[k][mask] = 1;
                }
            }
            for (int i = k + 1; i < m; ++i) {
                for (int mask = 0; mask < (1ll << (k + 1)); ++mask) {
                    if ((allowed >> mask) & 1) {
                        for (int aaa = 0; aaa < 2; ++aaa) {
                            dp[i][mask] = (dp[i][mask] + dp[i - 1][(1ll << k) * aaa + (mask >> 1)]) % mod;
                        }
                    }
                }
            }
            dp2[allowed] = 0;
            for (int mask = 0; mask < (1ll << (k + 1)); ++mask) {
                dp2[allowed] = (dp2[allowed] + dp[m - 1][mask]) % mod;
            }
        }
    }
    else{
        for(int first = 0; first < (1ll<<(1ll<<(k+1)));++first) {
            bool contain = false;
            if ((first >> wmask) & 1) contain = true;
            if ((first >> (wmask + (1ll << k))) & 1) contain = true;
            if ((first >> (wmask * 2)) & 1) contain = true;
            if ((first >> (wmask * 2 + 1)) & 1) contain = true;
            if(contain) dp2[first]=1;
            else dp2[first] = 0;
        }
    }

    
    int ans = 0;
    for(int first = 0; first < (1ll<<(1ll<<(k+1)));++first){
        int second = ((1ll<<(1ll<<(k+1)))-1) ^ first;


        bool contain = false;
        if((first>>wmask)&1) contain = true;
        if((first>>(wmask+(1ll<<k)))&1) contain = true;
        if((first>>(wmask*2))&1) contain = true;
        if((first>>(wmask*2+1))&1) contain = true;
        if(!contain) continue;
        //int second = ((1ll<<(1ll<<(k+1)))-1) ^ first;
        int secondwithout = second;
        if((secondwithout>>wmask)&1){
            secondwithout -= (1ll<<wmask);
        }
        if((secondwithout>>(wmask+(1ll<<k)))&1){
            secondwithout -= (1ll<<(wmask+(1ll<<k)));
        }
        if((secondwithout>>(wmask*2))&1){
            secondwithout -= (1ll<<(wmask*2));
        }
        if((secondwithout>>(wmask*2+1))&1){
            secondwithout -= (1ll<<(wmask*2+1));
        }
        if(secondwithout == second){
            continue;
        }
        ans = (ans + strict1[first] * ((dp2[second]+mod-dp2[secondwithout])%mod))%mod;
        // cout << first <<' ' << ans << '\n';
    }
    cout << ans;
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int t =1;
    // cin >> t;
    while(t--){
        solve();
    }
}