結果
| 問題 |
No.430 文字列検索
|
| コンテスト | |
| ユーザー |
eSeF
|
| 提出日時 | 2022-05-16 18:55:52 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 1,114 ms / 2,000 ms |
| コード長 | 1,617 bytes |
| コンパイル時間 | 159 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 96,300 KB |
| 最終ジャッジ日時 | 2024-11-10 01:00:53 |
| 合計ジャッジ時間 | 11,768 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 14 |
ソースコード
import random
class Rolling_Hash:
def __init__(self, S):
self.S = S
self.MOD = (1<<61)-1
#self.B = random.randint(1<<12, 1<<28)
self.B = 94627281
self.N = len(S)
self.hs = [0] * (self.N+1)
self.pw = [1] * (self.N+1)
self.pwinv = [1] * (self.N+1)
for i in range(self.N):
self.hs[i+1] = (ord(S[i]) * self.pw[i] + self.hs[i]) % self.MOD
self.pw[i+1] = (self.B * self.pw[i]) % self.MOD
self.pwinv[self.N] = pow(self.pw[self.N], -1, self.MOD)
for i in range(self.N):
j = self.N - i - 1
self.pwinv[j] = (self.pwinv[j+1] * self.B) % self.MOD
def hashvalue(self, idx):
return self.hs[idx]
def hash_substr(self, l, r): # [l, r)
subhash = (self.hs[r] - self.hs[l])
return (subhash * self.pwinv[l]) % self.MOD
def hash_segment(self, startidx, length):
return self.hash_substr(startidx, startidx + length)
def get_hasharray(self):
return self.hs
S = input()
RH = Rolling_Hash(S)
dict = {}
ds = {}
N = len(S)
for L in range(1, 11):
for i in range(N-L+1):
hs = RH.hash_segment(i, L)
if hs in dict:
dict[hs] += 1
else:
dict[hs] = 1
if S[i:i+L] in ds:
ds[S[i:i+L]] += 1
else:
ds[S[i:i+L]] = 1
#print(dict)
M = int(input())
ans = 0
for i in range(M):
C = input()
RHC = Rolling_Hash(C)
hsc = RHC.hash_substr(0,len(C))
if hsc in dict:
#print('exist', C, hsc)
ans += dict[hsc]
print(ans)
eSeF