접두사 접미사 검색

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

요약
N개 단어와 Q개의 접두사·접미사 쌍이 주어집니다. 각 쌍마다 접두사와 접미사를 모두 만족하는 단어 개수를 출력합니다. 입력 문자열 길이는 250만을 넘지 않습니다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 트라이, 해시맵, 분할 정복
정답자
아직 제출이 없습니다

문제

영어 학습자라면 영어 단어의 철자를 전부 정확히 기억하지 못하고 접두사와 접미사만 기억할 때가 있다. 예를 들어 appr로 시작하고 iate로 끝나는 단어를 쓰고 싶지만 가운데 부분은 기억나지 않을 수 있다. appreciate일 수도, appropriate일 수도, 그 비슷한 무엇일 수도 있다.

보통의 사전을 쓰면 특정 접두사로 시작하는 단어는 찾을 수 있지만, 특정 접미사로 끝나는 단어까지 걸러 내기는 불편하다. 그래서 주어진 접두사와 접미사를 모두 가지는 단어를 찾는 사전 기능이 있으면 도움이 된다. 우선은 그런 단어를 전부 나열하는 대신 개수만 세어 보자.

더 형식적으로는 NN개의 단어 목록이 주어진다. 이어서 두 문자열로 이루어진 QQ개의 질의가 주어진다. 주어진 목록에서 각 질의의 접두사와 접미사를 모두 가지는 단어의 개수를 출력하는 프로그램을 작성하라.

입력

입력은 다음과 같은 형식의 단일 테스트 케이스로 이루어진다.

$N$ $Q$
$w_1$
...
$w_N$
$p_1$ $s_1$
...
$p_Q$ $s_Q$

첫째 줄에는 두 정수 NN과 QQ가 주어진다. NN (1≤N≤1051 \le N \le 10^5)은 목록에 있는 단어의 수이고, QQ (1≤Q≤1051 \le Q \le 10^5)는 질의의 수이다. 다음 NN개 줄의 ii번째 줄에는 문자열 w_iw\_i가 주어진다. 그다음 QQ개 줄의 ii번째 줄에는 검색할 단어의 접두사와 접미사인 두 문자열 p_ip\_i와 s_is\_i가 주어진다.

다음은 가정할 수 있다.

  • 입력의 모든 문자열은 비어 있지 않고 알파벳 소문자로만 이루어진다.
  • 입력 문자열의 총 길이는 2,500,0002{,}500{,}000을 넘지 않는다.
  • 주어진 목록의 단어는 서로 다르다: i≠ji \neq j이면 w_i≠w_jw\_i \neq w\_j이다.
  • 접두사와 접미사의 쌍은 서로 다르다: i≠ji \neq j이면 (p_i,s_i)≠(p_j,s_j)(p\_i, s\_i) \neq (p\_j, s\_j)이다.

출력

각 질의마다 주어진 목록에서 주어진 접두사와 접미사를 모두 가지는 단어의 개수를 한 줄에 하나씩 출력한다.

예제3

  1. 예제 1

    입력
    6 7
    appreciate
    appropriate
    acceptance
    ace
    acm
    acetylene
    appr iate
    a e
    a a
    ac ce
    ace e
    acceptance acceptance
    no match
    
    예상 출력
    2
    5
    0
    2
    2
    1
    0
    
  2. 예제 2

    입력
    5 5
    d
    dd
    ddd
    dddd
    ddddd
    d d
    dd dd
    ddd ddd
    d dddd
    ddddd dd
    
    예상 출력
    5
    4
    3
    2
    1
    
  3. 예제 3

    입력
    7 4
    connected
    disconnected
    graph
    directed
    diameter
    distance
    minor
    c ed
    di ed
    dis ed
    dis e
    
    예상 출력
    1
    2
    1
    1