結果

問題 No.599 回文かい
コンテスト
ユーザー norioc
提出日時 2026-07-29 01:18:34
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 2,818 ms / 4,000 ms
+ 187µs
コード長 1,054 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 265 ms
コンパイル使用メモリ 95,720 KB
実行使用メモリ 92,800 KB
最終ジャッジ日時 2026-07-29 01:18:46
合計ジャッジ時間 9,529 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 22
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

from functools import cache
import sys
sys.setrecursionlimit(10**6)


def rolling_hash(s: str):
    """[l, r] のハッシュを返す関数を返す"""
    mod = 998244353
    p = 1009
    n = len(s)
    t = [ord(c) for c in s]
    a = [0] * n
    b = [0] * n
    a[0] = t[0]
    b[0] = 1
    for i in range(1, n):
        a[i] = (a[i-1] * p + t[i]) % mod
        b[i] = (p * b[i-1]) % mod

    # [l, r] のハッシュ値
    def f(l: int, r: int) -> int:
        assert 0 <= l <= r < n
        h = a[r]
        if l > 0:
            h -= a[l-1] * b[r-l+1]
            h %= mod
        return h

    return f


MOD = 10**9 + 7
S = input()

h = rolling_hash(S)
# @cache
memo = {}
def f(l, r):
    if l > r:
        return 1

    if (l, r) in memo:
        return memo[l, r]

    res = 1  # ひとつの単語は回文

    lo = l
    hi = r
    while lo < hi:
        if h(l, lo) == h(hi, r):
            res += f(lo+1, hi-1)
            res %= MOD

        lo += 1
        hi -= 1

    memo[l, r] = res
    return res


ans = f(0, len(S)-1)
print(ans)
0