結果
問題 | No.430 文字列検索 |
ユーザー |
![]() |
提出日時 | 2022-11-11 14:39:41 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 202 ms / 2,000 ms |
コード長 | 3,310 bytes |
コンパイル時間 | 164 ms |
コンパイル使用メモリ | 81,920 KB |
実行使用メモリ | 78,464 KB |
最終ジャッジ日時 | 2024-11-10 01:02:26 |
合計ジャッジ時間 | 2,326 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 14 |
ソースコード
def resolve():import sysinput = sys.stdin.readlines = input().rstrip()r = RollingHash()m = int(input())ans = 0ls = len(s)from collections import defaultdictd = defaultdict(set)for _ in range(m):c = input().rstrip()lc = len(c)if lc > ls:continueh = r.get_hash(c)d[lc].add(h)for k, v in d.items():for i in r.gen_hash_list(s, k):if i in v:ans += 1print(ans)class RollingHash:# verified: https://bit.ly/3X12Gzgm = Noner = Nonerp = {}def __init__(self, r: int = None, m=2305843009213693951) -> None:if self.m is None:self.m = m # (1 << 61) - 1if self.r is None:if r is None:import randomr = random.randint(2, self.m - 2)self.r = rdef _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 = 0for i in s[:length]:x *= self.rx += ord(i)x %= self.mres[0] = xdenom = self._powr(length - 1)for i, (j, k) in enumerate(zip(s[length:], s[:-length])):x -= ord(k) * denomx *= self.rx += ord(j)x %= self.mres[i + 1] = xreturn resdef gen_hash_list(self, s: str, length: int) -> int:x = 0for i in s[:length]:x *= self.rx += ord(i)x %= self.myield xdenom = self._powr(length - 1)for i, (j, k) in enumerate(zip(s[length:], s[:-length])):x -= ord(k) * denomx *= self.rx += ord(j)x %= self.myield xdef 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]:前方i文字のHashres = [0] * (len(s) + 1)for i, j in enumerate(s):res[i + 1] = (res[i] * self.r + ord(j)) % self.mreturn resdef tail_hash_list(self, s: str):# res[i]:後方i文字のHashres = [0] * (len(s) + 1)x = 1for i, j in enumerate(reversed(s)):res[i + 1] = (res[i] + x * ord(j)) % self.mx = x * self.rreturn resdef 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 0g = 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/3Uswhjlif r is None:r = len(s_or_head_list) + 1return (s_or_head_list[r] - s_or_head_list[l] * self._powr(r - l)) % self.mif __name__ == "__main__":resolve()