만드는 중입니다

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

DNA 해독

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

요약
접두어가 없는 유전자 집합에 유전자를 추가하거나 DNA 가닥을 덧붙이고, 매 연산 후 새로 해독 가능해진 가닥의 번호를 출력합니다.
난이도

어려움10점 중 9점

유형
트라이, 문자열 매칭, 동적 계획법
정답자
아직 제출이 없습니다

문제

고고학자들이 이웃 항성계의 행성에서 고대 생물의 화석 잔해를 발굴하고 있다. 연구자들은 이 생물들의 DNA 사슬이 유전자로부터 어떻게 조립되었는지 알고 싶어 한다.

DNA 사슬은 뉴클레오티드의 나열이다. 각 뉴클레오티드는 영문 소문자 하나로 표시하므로, DNA 사슬은 영문 소문자로 이루어진 문자열이다.

유전자도 영문 소문자로 이루어진 문자열이다. 올바른 유전자 집합에서는 어떤 유전자도 다른 유전자의 접두사가 되지 않는다.

DNA 사슬 dd는 유전자 집합 GG로 해독할 수 있다. dd를 GG에 속한 유전자 g1,g2,…,gkg_1, g_2, \ldots, g_k (k≥1k \ge 1)를 순서대로 이어 붙인 결과, 즉 d=g1g2…gkd = g_1g_2\ldots g_k로 나타낼 수 있다는 뜻이다. 같은 유전자를 여러 번 써도 된다.

연구팀에는 올바른 유전자 집합 GG와 DNA 사슬 배열 DD를 관리하는 컴퓨터 시스템이 필요하다. 유물 분석이 진행되면 연구자는 GG에 새 유전자를 추가하거나 DD의 끝에 새 DNA 사슬을 덧붙인다. 어느 시점에도 GG의 어떤 유전자도 다른 유전자의 접두사가 되지 않는다고 보장된다.

각 연산 후 연구자들은 현재 유전자 집합 GG로 새롭게 해독할 수 있게 된 DNA 사슬을 알고 싶어 한다. ii번째 연산 후 시스템은 그 연산 후에 처음으로 해독 가능해진 DD의 사슬 개수 kik_i를 보고하고, 이어서 그 사슬들의 번호 kik_i개를 출력해야 한다. 사슬은 DD에 추가된 순서대로 1부터 번호를 매긴다. 각 연산의 답은 다음 연산이 주어지기 전에 출력해야 한다.

입력

첫 줄에 연산의 개수 nn이 주어진다 (1≤n≤100 0001 \le n \le 100\,000).

이어지는 nn개의 줄은 각각 유전자를 추가하는 연산이면 +로, DNA 사슬을 DD의 끝에 추가하는 연산이면 ?로 시작한다. 공백 뒤에 영문 소문자로 이루어진 문자열 xix_i가 주어진다. 실제로 추가되는 문자열 sis_i는 다음과 같이 구한다.

i=1i = 1이면 si=xis_i = x_i이다. 그 외에는 직전 연산 후 처음으로 해독 가능해진 사슬의 개수를 ki−1k_{i-1}이라 하자. xix_i의 첫 글자를 맨 뒤로 옮기는 작업을 ki−1k_{i-1}번 반복한다. 즉 sis_i는 xix_i를 왼쪽으로 ki−1k_{i-1}만큼 순환 이동한 문자열이다.

모든 문자열은 비어 있지 않으며, 모든 연산의 문자열 길이 합은 10610^6을 넘지 않는다. 어느 시점에도 GG의 어떤 유전자도 다른 유전자의 접두사가 되지 않는다고 보장된다.

출력

nn개의 줄을 출력한다. ii번째 줄에는 kik_i를 먼저 출력하고, 이어서 ii번째 연산 후 처음으로 해독 가능해진 DD의 사슬 번호 kik_i개를 출력한다. 번호의 출력 순서는 상관없다.

힌트

처음 세 연산의 s1s_1, s2s_2, s3s_3은 입력의 문자열과 같다. k3=1k_3 = 1이므로 네 번째 연산의 s4s_4는 dabdab를 왼쪽으로 1만큼 순환 이동한 abdabd이다. 따라서 네 번째 연산에서 abdabd가 DD에 추가된다. 마지막으로 k4=0k_4 = 0이므로 s5=x5s_5 = x_5이다.

예제1

  1. 예제 1

    입력
    5
    ? abcabd
    + abc
    ? abcabc
    ? dabdab
    + abd
    
    예상 출력
    0
    0
    1 2
    0
    2 1 3