https://www.acmicpc.net/problem/1593
1593번: 문자 해독
첫째 줄에 고고학자들이 찾고자 하는 단어 W의 길이 g와 발굴된 벽화에서 추출한 문자열 S의 길이 |S|가 빈 칸을 사이에 두고 주어진다. (1≤g≤3000, g≤|S|≤3,000,000) 둘째 줄에 W, 셋째 줄에 S의 실
www.acmicpc.net
# 솔루션
# 1. w와 s의 각 알파벳을 총 알파벳 (a-z, A-Z) 52자리 배열에 실제 존재하면 +1, 그 외엔 0 로 담는다.
# 2. s를 담을 때, 슬라이딩 윈도우 기법을 적용한다.
# 3. 즉, s에 n개씩 담으면서, 담긴 문자열이 w와 같은 지 체크한다. 그리고 슬라이딩 윈도우 왼쪽 것은 빼고, 오른쪽 것은 새로 넣으면서 m까지 탐색한다.
import sys
input=sys.stdin.readline
n,m=map(int,input().split())
w=list(input())
s=list(input())
a=[0]*52
b=[0]*52
ans=0
for i in range(n):
if w[i].islower():
a[ord(w[i])-ord('a')]+=1
else:
a[ord(w[i])-ord('A')+26]+=1
for i in range(n):
if s[i].islower():
b[ord(s[i])-ord('a')]+=1
else:
b[ord(s[i])-ord('A')+26]+=1
if a==b:
ans+=1
for i in range(n,m):
j=i-n
if s[i].islower():
b[ord(s[i])-ord('a')]+=1
else:
b[ord(s[i])-ord('A')+26]+=1
if s[j].islower():
b[ord(s[j])-ord('a')]-=1
else:
b[ord(s[j])-ord('A')+26]-=1
if a==b:
ans+=1
print(ans)
'코딩 테스트 > 백준 - 일반' 카테고리의 다른 글
2531. 회전 초밥, 15961. 회전 초밥 (0) | 2023.01.28 |
---|---|
3078. 좋은 친구 (1) | 2023.01.28 |
11003. 최솟값 찾기 (0) | 2023.01.28 |