/**
 *    author:  [itmo] enot110
 *    created: 2024-11-10 12:25:03
**/
#include <bits/stdc++.h>

#define F first
#define S second
#define pb push_back
#define forn(i, n) for(int i = 0 ; (i) < (n) ; ++i)
#define eprintf(...) fprintf(stderr, __VA_ARGS__),fflush(stderr)
#define sz(a) ((int)(a).size())
#define all(a) (a).begin(),a.end()
#define pw(x) (1LL<<(x))

using namespace std;

typedef long long ll;
typedef double dbl;
typedef vector<int> vi;
typedef pair<int, int> pi;

const int inf = 1.01e9;
const dbl eps = 1e-9;

/* --- main part --- */


const int N = 110;
const int L = 1 << 16;
const int mod = 998244353;

int dp[2][L][8];
int go[L][2];

int save1[L];
int save2[L];


char s[5];
int n, m, k;
int pattern;

int good(int mm)
{
    if ((mm >> (pattern)) & 1) return 1;
    if ((mm >> (pw(k) + pattern)) & 1) return 1;
    if ((mm >> (pattern * 2)) & 1) return 1;
    if ((mm >> (pattern * 2 + 1)) & 1) return 1;
    return 0;
}

int T[L];

int main()
{
    #ifdef home
        assert(freopen("in", "r", stdin));
        // assert(freopen("out", "w", stdout));
    #endif

    scanf("%d%d%d", &n, &m, &k);
    scanf("%s", s);

    int K = pw(k); // 2^3
    int K1 = pw(k + 1); // 2^4
    int KK = pw(K1); // 2^16

    forn(mask, pw(k))
    {
        dp[0][0][mask] = 1;
    }
    int it = 0;
    for (int z = k; z <= max(n, m); z++)
    {
        forn(mm, KK) forn(mask, K) dp[it^1][mm][mask] = 0;
        if (z == n)
        {
            forn(mm, KK)
            {
                ll val = 0;
                forn(mask, K) val += dp[it][mm][mask];
                save1[mm] = val % mod;
            }
        }
        if (z == m)
        {
            forn(mm, KK)
            {
                ll val = 0;
                forn(mask, K) val += dp[it][mm][mask];
                save2[mm] = val % mod;
            }
        }
        forn(mm, KK) forn(mask, K) if (dp[it][mm][mask])
        {
            forn(x, 2)
            {
                int newmask = ((mask << 1) + x) & (K1 - 1);
                int &d = dp[it ^ 1][mm | (1 << newmask)][newmask & (K - 1)];
                d = (d +  dp[it][mm][mask]) % mod;
            }
        }
        it ^= 1;
    }

    pattern = 0;
    forn(i, k) pattern = pattern * 2 + s[i] - '0';


    int res = 0;

    if (n >= k + 1 && m >= k + 1)
    {
        forn(mm1, KK)
        {
            if (!good(mm1)) continue;
            int other = KK - 1 - mm1;
            for (int mm2 = other; mm2 > 0; mm2 = (mm2 - 1) & other)
            {
                if (!good(mm2)) continue;
                res = (res + save1[mm1] * (ll)save2[mm2]) % mod;
            }
        }
    }
    else if (n >= k + 1)
    {
        forn(mm, KK)
        {
            if (!good(mm)) continue;
            res = (res + save1[mm]) % mod;
        }
    }
    else if (m >= k + 1)
    {
        forn(mm, KK)
        {
            if (!good(mm)) continue;
            res = (res + save2[mm]) % mod;
        }
    }
    else
    {
        res = 1;
    }
    printf("%d\n", res);



    #ifdef home
        eprintf("time = %d ms\n", (int)(clock() * 1000. / CLOCKS_PER_SEC));
    #endif
    return 0;
}