토니의 연습장
해쉬 예제 본문
https://www.acmicpc.net/problem/5525
N = int(input())
M = int(input())
S = input()
# 해쉬 값 계산 위한 준비
mod = 1e9 + 7 # 10억 7 (큰 소수)
po = [0]*M
po[0] = 1
for i in range(1,M):
po[i]=po[i-1]*31 % mod
# Pn
Pn = "I"
for i in range(N): # O가 N개
Pn += "OI"
K = len(Pn)
# Pn의 해쉬 값 계산
Pn_hash = 0
for i in range(K):
Pn_hash *= 31
Pn_hash %= mod
Pn_hash += ord(Pn[i])-ord('A')+1
Pn_hash %= mod
# S[0:len(Pn)]
S_hash = 0
for i in range(K):
S_hash *= 31
S_hash %= mod
S_hash += ord(S[i])-ord('A')+1
S_hash %= mod
# S의 부분 문자열들의 해쉬 값 계산
count = 0
for i in range(0, M-K +1):
if S_hash == Pn_hash:
count += 1
# S_hash 갱신
largest = ord(S[i])-ord('A')+1
S_hash += mod - largest*po[K-1]%mod
S_hash %= mod
#### 위까지가 맨 앞자리 수를 빼 줌
S_hash *= 31
S_hash %= mod
if i+K < M:
S_hash += ord(S[i+K])-ord('A')+1
S_hash %= mod
print(count)
'Algorithm > Ch 3. 응용 자료구조' 카테고리의 다른 글
우선 순위 큐 예제 (0) | 2025.01.04 |
---|---|
그래프 예제 (1) | 2025.01.04 |
트리 예제 (1) | 2025.01.04 |
누적합 배열 예제 (2) | 2024.09.18 |