각각 영문 소문자로 이루어진 문자열 S0,…,SN−1이 주어진다. 다음 설명에 따라 이 문자열들로 구성한 트라이의 정보를 출력한다.
- Pi,j는 Si의 길이가 j인 접두사를 나타낸다. (여기서 0≤j≤∣Si∣)
- 집합 P을 P={Pi,j∣0≤i<N,0≤j≤∣Si∣}으로 정의한다. n=∣P∣라 하자.
- (S0,…,SN−1)의 트라이는 P의 원소에 대응하는 n개의 정점으로 이루어진 트리이다.
트라이의 각 정점 v은 어떤 str(v)∈P에 대응한다.
- str(v)=Pi,j를 만족하도록 (i,j)을 선택할 때, i이 최소화된 상태에서 (i,j)의 사전순으로 정점에 번호 0,1,…,n−1를 부여한다. 특히, str(0)은 빈 문자열이다.
- 각 정점 v (1≤v<n)에 대해, pv은 부모 정점의 번호를 나타낸다. 다시 말해, pv는 str(v)에서 마지막 문자를 제거하여 얻은 문자열에 대응하는 정점의 번호이다.
- 각 정점 v (1≤v≤n)에 대해, sv은 접미사 링크의 도착점을 나타낸다. 즉, sv은 str(v)의 접미사 중 P에 속하고 str(v)보다 짧은 가장 긴 접미사에 대응하는 정점의 번호이다.
n의 값을 출력하고, 각 정점 v (1≤v<n)에 대해 pv와 sv를 출력한다. 또한 각 i=0,1,…,N−1에 대해 Si에 대응하는 정점의 번호를 출력한다.
제약 조건
- 1≤N≤1000000
- 1≤∣Si∣≤1000000
- 1≤∑0≤i<N∣Si∣≤1000000
- S의 각 문자는 영문 소문자이다.