結果

問題 No.430 文字列検索
ユーザー strangerxxx
提出日時 2022-11-11 14:37:50
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 139 ms / 2,000 ms
コード長 3,370 bytes
コンパイル時間 156 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 78,108 KB
最終ジャッジ日時 2024-11-10 01:02:24
合計ジャッジ時間 2,062 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 14
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

def resolve():
import sys
input = sys.stdin.readline
s = input().rstrip()
r = RollingHash()
hashlist = r.head_hash_list(s)
m = int(input())
ans = 0
ls = len(s)
from collections import defaultdict
d = defaultdict(set)
for _ in range(m):
c = input().rstrip()
lc = len(c)
if lc > ls:
continue
h = r.get_hash(c)
d[lc].add(h)
for k, v in d.items():
for i in range(ls - k + 1):
if r.get_hash(hashlist, i, i + k) in v:
ans += 1
print(ans)
class RollingHash:
# verified: https://bit.ly/3X12Gzg
m = None
r = None
rp = {}
def __init__(self, r: int = None, m=2305843009213693951) -> None:
if self.m is None:
self.m = m # (1 << 61) - 1
if self.r is None:
if r is None:
import random
r = random.randint(2, self.m - 2)
self.r = r
def _powr(self, n: int) -> int:
if n not in self.rp:
self.rp[n] = pow(self.r, n, self.m)
return self.rp[n]
def hash_list(self, s: str, length: int) -> list:
n = len(s)
res = [None] * (n - length + 1)
x = 0
for i in s[:length]:
x *= self.r
x += ord(i)
x %= self.m
res[0] = x
denom = self._powr(length - 1)
for i, (j, k) in enumerate(zip(s[length:], s[:-length])):
x -= ord(k) * denom
x *= self.r
x += ord(j)
x %= self.m
res[i + 1] = x
return res
def gen_hash_list(self, s: str, length: int) -> int:
x = 0
for i in s[:length]:
x *= self.r
x += ord(i)
x %= self.m
yield x
denom = self._powr(length - 1)
for i, (j, k) in enumerate(zip(s[length:], s[:-length])):
x -= ord(k) * denom
x *= self.r
x += ord(j)
x %= self.m
yield x
def all_hash_list(self, s: str):
return [self.hash_list(s, i + 1) for i in range(len(s))]
def head_hash_list(self, s: str):
# res[i]:iHash
res = [0] * (len(s) + 1)
for i, j in enumerate(s):
res[i + 1] = (res[i] * self.r + ord(j)) % self.m
return res
def tail_hash_list(self, s: str):
# res[i]:iHash
res = [0] * (len(s) + 1)
x = 1
for i, j in enumerate(reversed(s)):
res[i + 1] = (res[i] + x * ord(j)) % self.m
x = x * self.r
return res
def get_hash(self, s_or_head_list, l: int = 0, r: int = None) -> int:
if type(s_or_head_list) is str:
if r is None:
return next(
self.gen_hash_list(s_or_head_list[l:], len(s_or_head_list) - l)
)
else:
if l == r:
return 0
g = self.gen_hash_list(s_or_head_list[l:], r - l)
for _ in range(r - l - 1):
next(g)
return next(g)
# verified: http://bit.ly/3Uswhjl
if r is None:
r = len(s_or_head_list) + 1
return (s_or_head_list[r] - s_or_head_list[l] * self._powr(r - l)) % self.m
if __name__ == "__main__":
resolve()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0