영문 소문자로 이루어진 문자열 S이 주어진다. 다음 설명에 따라 S의 회문 트리(회문 문자열 트리 또는 팰린드롬 트리라고도 한다)의 정보를 출력한다.
- P를 S의 비어 있지 않은 회문 부분 문자열의 집합이라 하고, n=∣P∣라 하자.
- S의 회문 트리는 2개의 트리로 구성되며, 이 트리들은 P의 원소에 대응하는 n개의 정점과
ODD 및 EVEN라고 하는 두 특수 정점을 포함한다.
- 회문 트리의 정점에 다음과 같이 번호를 매긴다:
ODD의 번호는 −1이고, EVEN의 번호는 0이다.
- 그 밖의 각 정점 v는 어떤 str(v)∈P에 대응한다. str(v)=Si⋯Sj−1에 대해, (i,j)는 j가 최소가 되도록 선택하고, j의 오름차순으로 정점에 번호 1,2,…,n을 부여한다.
- 각 정점 v (1≤v≤n)에 대해, pv를 부모 정점의 번호라 하자. 즉, pv는 str(v)의 첫 문자와 마지막 문자를 제거하여 얻은 회문에 대응하는 정점의 번호이다. 단, ∣str(v)∣=2이면 부모는
EVEN (번호 0)이고, ∣str(v)∣=1이면 부모는 ODD (번호 −1)이다.
- 각 정점 v (1≤v≤n)에 대해, sv를 v에서 나가는 접미사 링크의 도착점이라 하자. 즉, sv은 str(v)의 비어 있지 않은 회문 접미사 중 str(v)보다 짧은 가장 긴 것에 대응하는 정점의 번호이다. 그러한 회문 접미사가 존재하지 않으면, 접미사 링크의 도착점은
EVEN (번호 0)로 정의한다.
n을 출력하고, 각 v (1≤v≤n)에 대해 pv,sv를 출력한다.
또한 각 i=1,2,…,∣S∣에 대해, 길이가 i인 접두사 S0⋯Si−1의 가장 긴 회문 접미사에 대응하는 정점의 번호를 출력한다.
제약 조건
- 1≤∣S∣≤1000000
- S의 각 문자는 영문 소문자이다.