#include using namespace std; static const long long MOD = 998244353; int N, M, K; string S; vector cs; vector> kinds; long long ans = 0; inline long long op(long long a, long long b) { return (a + b) % MOD; } void digit_dp() { unordered_map dp, pp; auto encode = [](int m, bool lt) { return (long long)m << 1 | (lt ? 1LL : 0LL); }; auto decode = [](long long key) { return make_pair((int)(key >> 1), (bool)(key & 1)); }; dp[encode(0, false)] = 1; for (int x = 0; x < M; ++x) { pp.clear(); dp.swap(pp); for (auto &it : pp) { long long key = it.first; long long v = it.second; auto [m, lt] = decode(key); int p = x; if (lt) { if (m > 0) { dp[encode(m, true)] = op(dp[encode(m, true)], v * m % MOD); if (m >= K) ans = (ans + v * m) % MOD; } if (m < 26) { dp[encode(m + 1, true)] = op(dp[encode(m + 1, true)], v * (26 - m) % MOD); if (m + 1 >= K) ans = (ans + v * (26 - m)) % MOD; } } else if (p < N) { for (int i = 0; i < cs[p]; ++i) { int nm, b; if (p == 0) { nm = 0; b = 0; } else { nm = kinds[p - 1].first; b = kinds[p - 1].second; } if (!(b & (1 << i))) nm++; dp[encode(nm, true)] = op(dp[encode(nm, true)], v); if (nm >= K) ans = (ans + v) % MOD; } if (p + 1 < N && kinds[p].first >= K) { ans = (ans + 1) % MOD; } dp[encode(0, false)] = op(dp[encode(0, false)], v); } } } } int main() { cin >> N >> M >> K; cin >> S; cs.resize(N); for (int i = 0; i < N; ++i) cs[i] = S[i] - 'a'; set st; int b = 0; for (int i = 0; i < N; ++i) { st.insert(S[i]); b |= 1 << (S[i] - 'a'); kinds.emplace_back((int)st.size(), b); } digit_dp(); cout << ans % MOD << '\n'; return 0; }