문자 인식

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

요약
여러 개의 작은 0과 1 격자 패턴이 하나의 큰 질의 격자 안에 부분 격자로 등장하는지 모두 찾아 그 번호를 출력한다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 해시맵, 구현, 행렬
정답자
아직 제출이 없습니다

문제

사진은 높이 nn과 너비 mm의 00과 11로만 이뤄진 이차원 격자이다.

당신은 어떤 사진에 포함된 글자를 모두 찾으려고 한다. 각 글자를 표현하는 KK개의 사진과, 글자를 추출할 사진이 주어질 때, 해당 사진에 포함된 글자의 집합 SS를 구하여라.

높이가 NN, 너비가 MM인 어떤 사진 AA와 높이가 n_in\_i, 너비가 m_im\_i인 글자 B_iB\_i가 있을 때, 사진 AA에 글자 B_iB\_i가 포함되어 있다는 것은 1≤p≤N−n_i+11 \le p \le N - n\_i + 1, 1≤q≤M−m_i+11 \le q \le M - m\_i + 1인 어떤 정수 pp, qq가 존재하여 1≤r≤n_i1 \le r \le n\_i, 1≤s≤m_i1 \le s \le m\_i인 가능한 모든 (r,s)(r, s) 정수 쌍에 대해 A\[p+r−1]\[q+s−1]=B_i\[r]\[s]A\[p + r - 1]\[q + s - 1] = B\_i\[r]\[s]를 만족한다는 것을 의미한다.

입력

첫 번째 줄에 KK가 주어진다. (1≤K≤250,0001 \le K \le 250\\,000)

두 번째 줄부터 KK개의 글자 사진이 차례대로 주어진다. 이 때 ii번째로 주어지는 사진의 번호는 ii이다. 사진의 입력 형식은 다음과 같다. 첫 번째 줄에 사진의 높이 n_in\_i과 너비 m_im\_i이 차례대로 주어지고, 두 번째 줄부터 n_in\_i개의 줄에 걸쳐 00과 11로만 이뤄진 길이 m_im\_i의 문자열이 주어진다. (1≤n_i,m_i≤250,000;1 \le n\_i, m\_i \le 250\\,000; ∑_i=1Kn_i×m_i≤250,000\displaystyle\sum\_{i=1}^{K}{n\_i \times m\_i} \le 250\\,000)

이후 글자를 추출할 사진이 주어진다. 사진의 입력 형식은 다음과 같다. 첫 번째 줄에 사진의 높이 NN과 너비 MM이 차례대로 주어지고, 두 번째 줄부터 NN개의 줄에 걸쳐 00과 11로만 이뤄진 길이 MM의 문자열이 주어진다. (1≤N,M≤250,000;1 \le N, M \le 250\\,000; N×M≤250,000N \times M \le 250\\,000)

서로 다른 글자가 같은 사진으로 표현될 수 있다. 따라서, 동일한 사진이 여러 개 주어질 수 있음에 주의하라.

출력

첫 번째 줄에 집합의 크기 ∣S∣|S|를 출력한다. (0≤∣S∣≤K0 \le \lvert S \rvert \le K)

두 번째 줄에 집합에 포함된 글자의 번호를 오름차순으로 출력한다.

예제1

  1. 예제 1

    입력
    4
    2 2
    01
    10
    2 2
    00
    00
    2 2
    11
    11
    2 2
    01
    10
    4 4
    0110
    0110
    1001
    0100
    
    예상 출력
    3
    1 3 4