結果
| 問題 |
No.599 回文かい
|
| コンテスト | |
| ユーザー |
tktk_snsn
|
| 提出日時 | 2021-01-14 00:02:14 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,589 bytes |
| コンパイル時間 | 186 ms |
| コンパイル使用メモリ | 82,016 KB |
| 実行使用メモリ | 850,392 KB |
| 最終ジャッジ日時 | 2024-11-22 20:57:52 |
| 合計ジャッジ時間 | 44,574 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 13 TLE * 8 MLE * 1 |
ソースコード
from functools import lru_cache
class RollingHash:
def __init__(self, S, base=1007, mod=(1 << 61) - 1):
"""
input
S : ハッシュ化したい文字列、配列の場合はatoiメソッドをいじること
base : 基数
mod : hashを丸めるやつ。基本そのまま使う
"""
self.size = len(S)
self.base = base
self.mod = mod
self.h_table = [0] * (self.size + 1)
self.power = [0] * (self.size + 1)
self.power[0] = 1
for i, s in enumerate(S):
s = self.atoi(s)
self.h_table[i + 1] = (self.h_table[i] * base + s) % mod
self.power[i + 1] = self.power[i] * base % mod
@staticmethod
def atoi(a):
return ord(a) - ord("a") + 1
def get(self, L, R):
"""閉区間S[L, R)のhash値を返す()"""
res = self.h_table[R] - self.h_table[L] * self.power[R - L] % self.mod
return res % self.mod
def calc_hash(self, S):
res = 0
for s in S:
res = (res * self.base + self.atoi(s)) % self.mod
return res
mod = 10 ** 9 + 7
S = input()
RH = RollingHash(S)
def get_opposite(l, r):
return len(S) - r, len(S) - l
@lru_cache(maxsize=None)
def is_match(l, r):
ll, rr = get_opposite(l, r)
return RH.get(l, r) == RH.get(ll, rr)
N = len(S) // 2
dp = [0] * (N + 1)
dp[0] = 1
ans = 0
for r in range(N + 1):
for l in range(r):
if is_match(l, r):
dp[r] += dp[l]
dp[r] %= mod
ans += dp[r]
ans %= mod
print(ans)
tktk_snsn