짝수 부분 문자열

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

요약
최대 5개 문자가 주어진 질의마다, 그 문자들이 모두 짝수 번 나타나는 부분 문자열의 개수를 센다.
난이도

어려움10점 중 8점

유형
비트 연산, 해시맵, 누적 합
정답자
아직 제출이 없습니다

문제

알파벳 a부터 t까지만 사용하는 문자열 SS가 있다. 다음 쿼리를 처리하는 프로그램을 작성하시오.

  • k c1 c2 ... ck: SS의 연속한 부분 문자열 중에서 알파벳 c1,c2,…,ckc_1, c_2, \dots, c_k가 모두 짝수 번 등장하는 것의 개수를 출력한다.

한 번도 등장하지 않은 알파벳은 등장 횟수가 0번이므로 짝수로 센다. 부분 문자열은 시작 위치와 끝 위치의 쌍으로 구분하며, 내용이 같아도 위치가 다르면 따로 센다. 길이가 0인 부분 문자열은 세지 않는다.

입력

첫째 줄에 테스트 케이스의 개수 TT (1≤T≤51 \le T \le 5)가 주어진다.

각 테스트 케이스의 첫째 줄에는 문자열 SS가 주어진다. SS의 길이는 100,000을 넘지 않고, a부터 t까지의 알파벳으로만 이루어져 있다. 둘째 줄에는 쿼리의 개수 QQ (1≤Q≤300001 \le Q \le 30000)가 주어진다.

다음 QQ개의 줄에는 쿼리가 한 줄에 하나씩 k c1 c2 ... ck 형식으로 주어진다. kk는 5보다 작거나 같은 자연수이고, c1,c2,…,ckc_1, c_2, \dots, c_k는 쿼리에 포함된 알파벳이다. 한 쿼리에 같은 알파벳이 두 번 이상 주어지는 경우는 없다.

출력

각 쿼리마다 조건을 만족하는 부분 문자열의 개수를 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    1
    cacca
    5
    3 c a b
    2 c b
    2 a b
    3 c b a
    2 a b
    
    예상 출력
    2
    7
    6
    2
    6
    
  2. 예제 2

    입력
    1
    a
    3
    1 a
    1 b
    5 a b c d e
    
    예상 출력
    0
    1
    0