#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <bitset>
#include <random>

#ifdef LOCAL
#define eprintf(...) fprintf(stderr,__VA_ARGS__)
clock_t __my_start_clock = clock();
#else
#define eprintf(...)
#endif

#define TIMESTAMP(x) eprintf("["#x"] Time : %.3lf s.\n", (clock() - __my_start_clock)*1.0/CLOCKS_PER_SEC)
#define TIMESTAMPf(x,...) eprintf("[" x "] Time : %.3lf s.\n", __VA_ARGS__, (clock() - __my_start_clock)*1.0/CLOCKS_PER_SEC)

#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define db3(x, y, z) cerr << "(" << #x << ", " << #y << ", " << #z << ") = (" << x << ", " << y << ", " << z << ")\n"
#define dbv(a) cerr << #a << " = "; for (auto xxxx: a) cerr << xxxx << " "; cerr << endl


using namespace std;

#ifdef LOCAL
static struct __timestamper {
    string what;
    __timestamper(const char* what) : what(what){};
    __timestamper(const string& what) : what(what){};
    ~__timestamper(){
        TIMESTAMPf("%s", what.data());
    }
} __TIMESTAMPER("end");
#else
struct __timestamper {};
#endif

typedef long long ll;
typedef long double dbl;

const int MOD = 998244353;

void add(int &x, int y) {
    x += y;
    if (x >= MOD) x -= MOD;
}

int mul(int x, int y) {
    return 1LL * x * y % MOD;
}

int dp[102][16][1 << 16][2];

int solve(int n, int m, int k, string s) {
    int smask = 0;
    for (int i = 0; i < k; i++) smask += (1 << (k - 1 - i)) * (s[i] - '0');
    int BITS = (1 << k) - 1;
    int t = 1 << (k + 1);
    
    memset(dp, 0, sizeof(dp));
    for (int mask = 0; mask < t; mask++) {
        int f = (mask & BITS) == smask || ((mask >> 1) & BITS) == smask;
        dp[k + 1][mask][1 << mask][f] = 1;
    }

    for (int i = k; i < max(n, m); i++) {
        for (int last = 0; last < t; last++) {
            for (int mask = 0; mask < (1 << t); mask++) {
                for (int was = 0; was < 2; was++) {
                    if (dp[i][last][mask][was] == 0) continue;
                    for (int c = 0; c < 2; c++) {
                        int nlast = ((last & BITS) << 1) + c;
                        int nmask = mask | (1 << nlast);
                        int nwas = was || (nlast & BITS) == smask;
                        add(dp[i + 1][nlast][nmask][nwas], dp[i][last][mask][was]);
                    }
                }
            }
        }
    }

    if (min(n, m) == k) {
        if (max(n, m) == k) {
            return 1;
        }
        int ans = 0;
        for (int last = 0; last < t; last++) {
            for (int mask = 0; mask < (1 << t); mask++) {
                add(ans, dp[max(n, m)][last][mask][1]);
            }
        }
        return ans;
    }

    auto get = [&](int len) {
        vector<int> v(1 << (t));
        for (int last = 0; last < t; last++) {
            for (int mask = 0; mask < (1 << t); mask++) {
                add(v[mask], dp[len][last][mask][1]);
            }
        }
        return v;
    };
    auto v1 = get(n);
    auto v2 = get(m);

//    auto func = [&](auto &v) {
//        for (int i = 0; i < t; i++) {
//            for (int j = 0; j < (1 << t); j++) {
//                if (j & (1 << i)) continue;
//                int l = j + (1 << i);
//                add(v[j], v[l]);
//            }
//        }
//    };
//    auto ifunc = [&](auto &v) {
//        for (int i = t - 1; i >= 0; i--) {
//            for (int j = (1 << t) - 1; j >= 0; j--) {
//                if (j & (1 << i)) continue;
//                int l = j + (1 << i);
//                add(v[j], MOD-v[l]);
//            }
//        }
//    };
    auto afunc = [&](auto &v, bool inv) {
        for (int i = 0; i < t; i++) {
            for (int j = 0; j < (1 << t); j++) {
                if (j & (1 << i)) continue;
                int l = j + (1 << i);
                if (inv) {
                    add(v[j], MOD - v[l]);
                } else {
                    add(v[j], v[l]);
                }
            }
        }
    };
    afunc(v1, false);
    afunc(v2, false);
    for (int i = 0; i < (1 << t); i++) v1[i] = mul(v1[i], v2[i]);
    afunc(v1, true);
    return v1[0];
}

void test() {
    solve(100, 100, 3, "000");
    exit(0);
}

int main() {
#ifdef LOCAL
    freopen("in", "r", stdin);
#endif
//    test();

    int n, m, k;
    string s;
    while (cin >> n >> m >> k >> s) {
        cout << solve(n, m, k, s) << endl;
    }

    return 0;
}