結果
問題 | No.599 回文かい |
ユーザー |
![]() |
提出日時 | 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 sysreadline=sys.stdin.readlineimport randomclass Rolling_Hash:def __init__(self,lst,base,mod):self.len=len(lst)self.base=baseself.mod=modself.rolling_hash=[None]*(self.len+1)self.rolling_hash[0]=0x=1for 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.modx*=self.basex%=self.modx=pow(x,self.mod-2,self.mod)self.base_reverse=[None]*(self.len+1)self.base_reverse[self.len]=xfor i in range(self.len-1,-1,-1):self.base_reverse[i]=self.base_reverse[i+1]*self.base%self.moddef __getitem__(self,i):if type(i)==int:a,b=i,i+1else:a,b=i.start,i.stopif a==None or a<-self.len:a=0elif self.len<=a:a=self.lenelif a<0:a+=self.lenif b==None or self.len<=b:b=self.lenelif b<-self.len:b=0elif b<0:b+=self.lenreturn (self.rolling_hash[b]-self.rolling_hash[a])*self.base_reverse[a]%self.moddef __len__(self):return self.lenS=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+7dp=[0]*(N//2+1)for i in range(N//2,-1,-1):dp[i]+=1dp[i]%=modfor j in range(i+1,N//2+1):if S[i:j]==S[N-j:N-i]:dp[i]+=dp[j]dp[i]%=modans=dp[0]print(ans)