아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

마음의 오른쪽 확장

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

요약
유한 문자열 s 뒤에 t를 무한히 반복한 무한 문자열 n개가 주어질 때, 같은 묶음의 두 문자열이 서로의 부분수열이 되도록 묶음을 나누고 그 수를 최소로 한다.
난이도

어려움10점 중 9점

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

문제

어느 날 nn명의 사람들이 마음을 확장하기로 했다.

처음에 ii번째 사람의 마음은 소문자 영어 알파벳으로 이루어진 두 문자열 sis_i와 tit_i이다. 확장 후에는 ii번째 사람의 마음이 오른쪽으로 무한히 이어지는 문자열 wi=si+ti+ti+⋯w_i=s_i+t_i+t_i+\cdots가 된다. 즉 wiw_i는 sis_i 뒤에 tit_i가 무한히 이어붙은 문자열이다. 예를 들어 si=mis_i=\text{mi}, ti=ndt_i=\text{nd}이면 wi=mindndndnd…w_i=\text{mindndndnd}\dots이다.

확장된 마음을 가진 두 사람이 서로 관심을 가진다는 것은 첫 번째 사람의 마음이 두 번째 사람의 마음의 부분 수열이고, 두 번째 사람의 마음도 첫 번째 사람의 마음의 부분 수열이라는 뜻이다. 무한 문자열 aa가 무한 문자열 bb의 부분 수열이라는 것은 1≤i1<i2<i3<…1 \le i_1 < i_2 < i_3 < \ldots인 무한 수열이 존재하여 각 jj에 대해 aj=bija_j=b_{i_j}인 것이다. 예를 들어 무한 문자열 "baaa…\dots"는 무한 문자열 "cabababab…\dots"의 부분 수열이다.

마음을 확장한 사람들은 한 그룹에 속한 임의의 두 사람이 서로 관심을 가지도록 그룹을 나누기로 했다. 그룹의 수가 최소가 되도록 사람들을 나누어야 한다.

입력

첫째 줄에는 마음을 확장하기로 한 사람의 수 nn이 주어진다(1≤n≤100 0001 \le n \le 100\,000).

다음 nn개 줄에는 각각 소문자 영어 알파벳으로 이루어진 비어 있지 않은 두 문자열 sis_i와 tit_i가 주어진다. 이는 마음 확장 전 각 사람의 마음을 나타낸다.

모든 문자열의 길이의 합은 1 000 0001\,000\,000을 넘지 않는다.

출력

첫째 줄에는 최소 그룹 수를 출력한다.

그다음 각 그룹을 다음과 같이 출력한다. 먼저 이 그룹에 속한 사람 수를 출력하고, 그다음 그 사람들의 번호를 출력한다.

각 번호는 정확히 한 번씩 출력되어야 한다. 그룹의 순서와 그룹 내 사람들의 번호 순서는 아무래도 좋다. 가능한 방법이 여러 가지라면 그중 아무거나 출력해도 된다.

힌트

첫 번째 예제에서 각 사람의 확장된 마음은 다음과 같다.

  • "abababab…\ldots"
  • "abababab…\ldots"
  • "aabbabbabb…\ldots"
  • "xyyyyyy…\ldots"
  • "zwwwwww…\ldots"

4번과 5번 사람은 다른 누구와도 관심을 가지지 않는다. 그러나 처음 세 사람은 서로 관심을 가진다. 따라서 {1,2,3}\{1,2,3\}, {4}\{4\}, {5}\{5\}와 같이 그룹을 나눌 수 있다.

예제2

  1. 예제 1

    입력
    5
    ab ab
    ababab ab
    a abb
    x y
    z w
    
    예상 출력
    3
    3 1 2 3
    1 4
    1 5
    
  2. 예제 2

    입력
    3
    kokoko tlin
    koko kotlin
    ko kokotlin
    
    예상 출력
    2
    1 1
    2 2 3