만드는 중입니다

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

Qizz Quzz (어려움)

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

요약
주어진 레이블 수열에서 일반화 피즈 버즈 프로그램의 출력이 될 수 있는 가장 긴 앞부분의 길이를 구합니다.
난이도

어려움10점 중 8점

유형
문자열, 문자열 매칭, 수학
정답자
아직 제출이 없습니다

문제

Fizz Buzz 문제에서 코딩 실력을 보여준 뒤, FizzBuzz Corp.의 코드 닌자 직무 면접 2차 전형에 올랐습니다. 이번 면접에서는 Generalized Fizz Buzz 문제를 풉니다.

Generalized Fizz Buzz는 원래의 Fizz Buzz와 비슷합니다. 프로그램은 1부터 양의 정수를 차례로 출력하되, 일부 특별한 수와 그 배수는 문자열로 바꿔 출력합니다. 어떤 수가 여러 특별한 수로 나누어떨어지면, 해당하는 문자열을 모두 이어 붙인 값으로 바꿉니다.

이 문제에서 Generalized Fizz Buzz를 구현하지는 않습니다. 주어진 수열이 그런 프로그램의 출력일 수 있는지 판단하면 됩니다.

하나의 경우는 다음 매개변수로 정해집니다.

  • 양의 정수 nn.
  • 0 이상의 정수 kk.
  • 서로 다른 양의 정수 d1<d2<...<dkd_1 < d_2 < ... < d_k.
  • 소문자 영문자로 이루어진 문자열 s1,...,sks_1, ..., s_k.

각 값의 의미는 다음과 같습니다.

  • nn은 프로그램이 출력해야 하는 수열의 길이입니다.
  • kk는 치환 규칙의 개수입니다.
  • 각 규칙은 "did_i의 배수 대신 문자열 sis_i를 출력한다"는 형태입니다.
  • 여러 규칙이 적용되면, 해당하는 sis_i를 약수가 작은 것부터 큰 순서로 이어 붙인 것이 라벨이 됩니다.

예를 들어 원래의 Fizz Buzz는 k=2k = 2, d=(3,5)d = (3, 5), s=(fizz,buzz)s = (fizz, buzz)입니다. n=17n = 17일 때 올바른 출력은 다음과 같습니다.

1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17

15는 3과 5로 모두 나누어떨어지므로 s1s_1과 s2s_2를 이어 붙인 문자열로 출력합니다. sis_i의 순서는 바꿀 수 없으므로 15에 buzzfizz를 출력할 수는 없습니다.

Monika도 자신만의 Generalized Fizz Buzz 프로그램을 작성했습니다. 이 프로그램은 각 문자열 sis_i의 길이가 1자 이상 25자 이하인 입력만 처리합니다. kk와 did_i는 아무리 커도 처리할 수 있습니다.

Monika는 라벨 수열 ℓ1,...,ℓn\ell_1, ..., \ell_n을 보여주었습니다. Monika의 프로그램 출력일 수 있는 접두 수열 ℓ1,...,ℓq\ell_1, ..., \ell_q가 되도록 하는 가장 큰 qq를 구하세요.

입력

첫 줄에는 테스트 케이스의 개수 tt가 주어집니다. 각 테스트 케이스 앞에는 빈 줄이 하나 있습니다.

각 테스트 케이스는 두 줄로 이루어집니다. 첫 줄에는 라벨의 개수인 양의 정수 n≤1000n \le 1000이 주어집니다. 둘째 줄에는 공백 한 칸으로 구분된 빈 문자열이 아닌 토큰 nn개 ℓ1,...,ℓn\ell_1, ..., \ell_n이 주어집니다. 각 토큰은 숫자와 소문자 영문자로만 이루어집니다.

출력

각 테스트 케이스마다 정수 qq를 한 줄에 출력합니다.

힌트

  • 첫 번째 예시에서 처음 여섯 개의 토큰은 k=1k = 1, d1=1d_1 = 1, s1=‘mlem‘s_1 = `mlem`인 Generalized Fizz Buzz 프로그램의 출력입니다. Samko의 프로그램과 Monika의 프로그램 모두 이 입력을 처리할 수 있으므로 두 답은 모두 6입니다.
  • 두 번째 예시에서 2는 qizz, 3은 quzz로 바뀌어야 합니다. 처음 다섯 개 토큰은 맞지만, 다음 토큰은 quzzqizz가 아니라 qizzquzz여야 하고, 마지막 토큰은 007이 아니라 7이어야 합니다.
  • 세 번째 예시에서 hunter2는 문자와 숫자를 모두 포함하므로 잘못되었습니다.
  • 네 번째 예시에서 d=(1,2)d = (1, 2), s=(haha,haha)s = (haha, haha)입니다. 문자열 sis_i들이 서로 달라야 할 필요는 없습니다.
  • 다섯 번째 예시에서는 2가 bat, 4가 man, 5가 robin, 6도 bat, 8도 man으로 바뀌었을 수 있으므로 수열 전체가 올바릅니다.

예제1

  1. 예제 1

    입력
    5
    
    7
    mlem mlem mlem mlem mlem mlem fail
    
    7
    1 qizz quzz qizz 5 quzzqizz 007
    
    8
    1 2 3 4 hunter2 is my password
    
    2
    haha hahahaha
    
    9
    1 bat 3 batman robin batbat 7 batmanman 9
    
    예상 출력
    6
    5
    4
    2
    9