# 8069번: 단어 탐색 발췌
class TrieNode:
def __init__(self):
self.children = {}
self.is_end = False
def search(self, word):
node = self.root
for ch in word:
if ch not in node.children:
return False
node = node.children[ch]
return node.is_end
# 8070번: 문자열 해싱 발췌
def get_hash(l, r): # 1-indexed
return (h[r] - h[l - 1] * pw[r - l + 1]) % MOD
if get_hash(a, b) == get_hash(c, d):
result.append("1")
# 8071번: 패턴 매칭 발췌
# 불일치 발생 시 pi 배열로 j 점프
while j > 0 and t[i] != p[j]:
j = pi[j - 1]
# 완전 매칭 발견 후 다음 가능 위치로 이동
if j == m - 1:
matches.append(i - m + 2)
j = pi[j]
# 8072번: 가장 긴 반복 부분 문자열 발췌
sa = sorted(range(n), key=lambda i: s[i:])
# 인접 접미사 쌍에서 LCP 최댓값 산출
for i in range(n - 1):
a, b = sa[i], sa[i + 1]
# a, b 위치에서 공통 접두사 길이 측정
j = pi[j]로 설정해야 이후 겹치는 패턴도 탐지 가능
- **해시 충돌 방지**: 메르센 소수 $(2^{61}-1)$ 사용 또는 이중 해시(Double Hashing) 적용으로 충돌 확률 극소화
- **슬라이싱 직접 비교 금지**: 부분 문자열 쿼리에서 s[a:b] == s[c:d]는 $O(L)$이므로 반드시 해시 배열로 대체