結果
| 問題 |
No.599 回文かい
|
| コンテスト | |
| ユーザー |
vwxyz
|
| 提出日時 | 2022-10-23 23:36:37 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,125 ms / 4,000 ms |
| コード長 | 1,627 bytes |
| コンパイル時間 | 203 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 77,824 KB |
| 最終ジャッジ日時 | 2024-07-02 12:04:31 |
| 合計ジャッジ時間 | 14,362 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 |
ソースコード
import sys
readline=sys.stdin.readline
import random
class Rolling_Hash:
def __init__(self,lst,base,mod):
self.len=len(lst)
self.base=base
self.mod=mod
self.rolling_hash=[None]*(self.len+1)
self.rolling_hash[0]=0
x=1
for i in range(1,self.len+1):
self.rolling_hash[i]=self.rolling_hash[i-1]+x*lst[i-1]
self.rolling_hash[i]%=self.mod
x*=self.base
x%=self.mod
x=pow(x,self.mod-2,self.mod)
self.base_reverse=[None]*(self.len+1)
self.base_reverse[self.len]=x
for i in range(self.len-1,-1,-1):
self.base_reverse[i]=self.base_reverse[i+1]*self.base%self.mod
def __getitem__(self,i):
if type(i)==int:
a,b=i,i+1
else:
a,b=i.start,i.stop
if a==None or a<-self.len:
a=0
elif self.len<=a:
a=self.len
elif a<0:
a+=self.len
if b==None or self.len<=b:
b=self.len
elif b<-self.len:
b=0
elif b<0:
b+=self.len
return (self.rolling_hash[b]-self.rolling_hash[a])*self.base_reverse[a]%self.mod
def __len__(self):
return self.len
S=readline().rstrip()
N=len(S)
base=random.randint(1<<50,1<<51)
S=Rolling_Hash([ord(s) for s in S],base,(1<<61)-1)
mod=10**9+7
dp=[0]*(N//2+1)
for i in range(N//2,-1,-1):
dp[i]+=1
dp[i]%=mod
for j in range(i+1,N//2+1):
if S[i:j]==S[N-j:N-i]:
dp[i]+=dp[j]
dp[i]%=mod
ans=dp[0]
print(ans)
vwxyz