import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] inputCheckArr = new int[4];
static int[] checkArr = new int[4];
static int checkCount;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int S = Integer.parseInt(st.nextToken());
int P = Integer.parseInt(st.nextToken());
char[] inputArr = br.readLine().toCharArray();
checkCount = 0;
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
checkArr[i] = Integer.parseInt(st.nextToken());
if (checkArr[i] == 0) checkCount++;
}
br.close();
int resultCount = 0;
for (int i = 0; i < P; i++) {
add(inputArr[i]);
}
if (checkCount == 4) resultCount++;
for (int i = P; i < S; i++) {
int j = i - P;
add(inputArr[i]);
remove(inputArr[j]);
if (checkCount == 4) resultCount++;
}
System.out.println(resultCount);
}
private static void add(char value) {
switch (value) {
case 'A':
inputCheckArr[0]++;
if (inputCheckArr[0] == checkArr[0]) checkCount++;
break;
case 'C':
inputCheckArr[1]++;
if (inputCheckArr[1] == checkArr[1]) checkCount++;
break;
case 'G':
inputCheckArr[2]++;
if (inputCheckArr[2] == checkArr[2]) checkCount++;
break;
case 'T':
inputCheckArr[3]++;
if (inputCheckArr[3] == checkArr[3]) checkCount++;
break;
}
}
private static void remove(char value) {
switch (value) {
case 'A':
if (inputCheckArr[0] == checkArr[0]) checkCount--;
inputCheckArr[0]--;
break;
case 'C':
if (inputCheckArr[1] == checkArr[1]) checkCount--;
inputCheckArr[1]--;
break;
case 'G':
if (inputCheckArr[2] == checkArr[2]) checkCount--;
inputCheckArr[2]--;
break;
case 'T':
if (inputCheckArr[3] == checkArr[3]) checkCount--;
inputCheckArr[3]--;
break;
}
}
}
슬라이딩 윈도우 알고리즘을 이용한 문제이다.
슬라이딩 윈도우는 투 포인터와 매우 유사하다.
오히려 같은 크기로 이동하다보니 조금 더 편한 것 같기도하다 😛
입력받은 문자열을 배열로받고 비밀번호 조건 배열과 매칭할 수 있게 입력 문자열 배열을 순차로돌며 비밀번호 조건 배열과 같은 순서로 각각의 자리에 카운트하여 조건을 만족하는지 판단하는 방식으로 구현하였다.