結果
| 問題 |
No.599 回文かい
|
| コンテスト | |
| ユーザー |
tktk_snsn
|
| 提出日時 | 2021-01-14 00:07:07 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,986 ms / 4,000 ms |
| コード長 | 1,530 bytes |
| コンパイル時間 | 256 ms |
| コンパイル使用メモリ | 82,308 KB |
| 実行使用メモリ | 76,608 KB |
| 最終ジャッジ日時 | 2024-11-22 20:59:33 |
| 合計ジャッジ時間 | 13,502 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 |
ソースコード
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
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