from collections.abc import Iterable def accum_dp(xs: Iterable, f, op, e, init: dict, *, is_reset=True): dp = init.copy() for x in xs: pp = {} if is_reset else dp.copy() dp, pp = pp, dp for fm_key, fm_val in pp.items(): for to_key, to_val in f(fm_key, fm_val, x): dp[to_key] = op(dp.get(to_key, e), to_val) return dp def f(k, v, x): global ans m, lt = k # (使った文字種, 未満か) p = x if lt: assert m > 0 # 使った文字を末尾に置く yield (m, True), v * m if m < 26: # 未使用の文字を末尾に置く yield (m+1, True), v * (26 - m) if m >= K: ans += v * m if m < 26 and m+1 >= K: ans += v * (26 - m) ans %= MOD elif p < N: # 文字 x より小さい文字を置く for d in range(26): # a=0, b=1, ... if d >= digits[p]: break if p == 0: nm, b = 0, 0 else: b = used_bits[p-1] nm = b.bit_count() if not (b & (1 << d)): nm += 1 yield (nm, True), v if nm >= K: ans += v ans %= MOD # 先頭 p 番目まで S と一致 if p+1 < N and used_bits[p].bit_count() >= K: ans += 1 ans %= MOD # not lt を維持 yield (0, False), v def op(a, b): return (a + b) % MOD def digit_dp(): init = {(0, False): 1} accum_dp(range(M), f, op, 0, init) MOD = 998244353 N, M, K = map(int, input().split()) S = input() digits = [ord(c) - ord('a') for c in S] used_bits = [] b = 0 for d in digits: b |= 1 << d used_bits.append(b) ans = 0 digit_dp() print(ans)