만드는 중입니다

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

문자열 찾기

시간 제한3초메모리 제한1024 MB

요약
T의 부분 문자열 중 P와 같은 문자 일치 패턴을 가진 것의 개수를 구합니다. 길이는 최대 1,000,000입니다.
난이도

보통10점 중 6점

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

문제

영어 소문자로 이루어진 두 문자열 AA와 BB가 다음 조건을 모두 만족하면, 두 문자열은 사실상 같다고 한다.

  1. AA와 BB의 길이가 같다.
  2. 모든 정수 ii, jj에 대해 AA의 ii번째 글자와 jj번째 글자가 같으면, BB의 ii번째 글자와 jj번째 글자도 같다.
  3. 모든 정수 ii, jj에 대해 AA의 ii번째 글자와 jj번째 글자가 다르면, BB의 ii번째 글자와 jj번째 글자도 다르다.

예를 들어 A=A = aba와 B=B = pqp는 사실상 같은 문자열이다. 하지만 A=A = abca와 B=B = abcb는 사실상 같은 문자열 쌍이 아니다.

문자열 TT와 PP가 주어질 때, TT의 연속된 부분문자열 중 PP와 사실상 같은 것의 개수를 구하는 프로그램을 작성하라.

예를 들어 T=T = abababbab이고 P=P = pqp이면, TT의 왼쪽부터 aba, bab, aba, bab, bab 다섯 개의 부분문자열이 PP와 사실상 같다.

다음 함수를 작성해야 한다.

  • int findP( char T [], char P [], int N, int M ): T는 길이 N+1인 배열(문자열)이다. P는 길이 M+1인 배열이다. T와 P에는 각각 길이 N과 M인 영어 소문자 문자열이 저장되어 있다. T와 P의 마지막 위치에는 \0이 저장되어 있다. findP는 T의 연속된 부분문자열 중 P와 사실상 같은 부분문자열의 개수를 리턴해야 한다.

제한

1≤N≤1 000 0001 \le N \le 1\,000\,000, 1≤M≤N1 \le M \le N.

예제1

  1. 예제 1

    입력
    a
    a
    
    예상 출력
    1