結果

問題 No.2388 At Least K-Characters
コンテスト
ユーザー norioc
提出日時 2026-01-08 23:52:56
言語 PyPy3
(7.3.17)
結果
TLE  
実行時間 -
コード長 1,824 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 213 ms
コンパイル使用メモリ 82,356 KB
実行使用メモリ 125,196 KB
最終ジャッジ日時 2026-01-08 23:53:06
合計ジャッジ時間 7,485 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 13 TLE * 1 -- * 20
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

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)
0