만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

좋은 부분 문자열의 개수

면접 대비

시간 제한2초메모리 제한512 MB

요약
문자열 s의 부분 문자열 중 나쁜 글자가 k개 이하인 서로 다른 문자열의 개수를 센다.
난이도

보통10점 중 6점

유형
문자열, 해시맵, 슬라이딩 윈도우
정답자
아직 제출이 없습니다

문제

알파벳 소문자로만 이루어진 문자열 ss가 주어진다. 26개의 알파벳은 각각 좋은 알파벳이거나 나쁜 알파벳이다.

길이가 ∣s∣|s|인 문자열 s=s1s2…s∣s∣s = s_1 s_2 \dots s_{|s|}에서 부분 문자열 s[l…r]s[l \dots r] (1≤l≤r≤∣s∣1 \le l \le r \le |s|)은 slsl+1…srs_l s_{l+1} \dots s_r을 뜻한다.

부분 문자열 s[l…r]s[l \dots r]을 이루는 문자 sl,sl+1,…,srs_l, s_{l+1}, \dots, s_r 중에서 나쁜 알파벳의 개수가 kk개 이하이면, 그 부분 문자열을 좋다고 한다.

ss의 서로 다른 좋은 부분 문자열의 개수를 찾는 프로그램을 작성하시오. s[x…y]≠s[p…q]s[x \dots y] \ne s[p \dots q]인 경우에 두 부분 문자열 s[x…y]s[x \dots y]와 s[p…q]s[p \dots q]를 서로 다르다고 한다. 위치가 달라도 내용이 같은 부분 문자열은 한 번만 센다.

입력

첫째 줄에 알파벳 소문자로 이루어진 문자열 ss가 주어진다. ss의 길이는 1500을 넘지 않는다.

둘째 줄에 0과 1로 이루어진 길이 26의 문자열이 주어진다. ii번째 글자가 1이면 ii번째 알파벳이 좋은 알파벳이고, 0이면 나쁜 알파벳이다. 첫 번째 문자는 알파벳 'a'를 나타내고, 두 번째 문자는 'b'를 나타낸다.

셋째 줄에 kk가 주어진다. (0≤k≤∣s∣0 \le k \le |s|)

출력

ss의 서로 다른 좋은 부분 문자열의 개수를 출력한다.

예제5

  1. 예제 1

    입력
    ababab
    01000000000000000000000000
    1
    
    예상 출력
    5
    
  2. 예제 2

    입력
    acbacbacaa
    00000000000000000000000000
    2
    
    예상 출력
    8
    
  3. 예제 3

    입력
    a
    10000000000000000000000000
    0
    
    예상 출력
    1
    
  4. 예제 4

    입력
    a
    00000000000000000000000000
    0
    
    예상 출력
    0
    
  5. 예제 5

    입력
    aaaaaaaaaa
    11111111111111111111111111
    0
    
    예상 출력
    10