트리는 컴퓨터 과학에서 다양하게 쓰인다. 가장 흔히 쓰이는 것은 루트 있는 이진 트리이지만, 다른 종류의 루트 트리도 유용할 수 있다. 그 예로 순서 트리(ordered tree) 가 있는데, 이 트리에서는 각 노드의 부분 트리들에 순서가 매겨져 있다. 각 노드의 자식 수는 정해져 있지 않으며 상한도 없다. 형식적으로, 순서 트리는 다음을 만족하는 유한한 노드 집합 $T$ 로 이루어진다.
또한 root($T_1$), ..., root($T_m$) 을 root($T$) 의 자식으로 정의하며, root($T_i$) 가 $i$ 번째 자식이다. root($T_1$), ..., root($T_m$) 은 서로 형제(sibling)이다.
모든 노드를 같은 크기의 공간에 저장할 수 있도록, 순서 트리를 루트 있는 이진 트리로 표현하는 것이 더 편리한 경우가 많다. 변환은 다음 단계로 이루어진다.
아래 그림이 이 과정을 보여 준다.
0 0
/ | \ /
1 2 3 ===> 1
/ \ \
4 5 2
/ \
4 3
\
5
대부분의 경우 변환 후 트리의 높이(루트에서 잎까지의 경로 중 가장 긴 것의 간선 수)가 늘어난다. 많은 트리 알고리즘의 수행 시간이 높이에 의존하므로 이는 바람직하지 않다.
변환 전과 변환 후의 트리 높이를 계산하는 프로그램을 작성하라.
입력은 여러 줄로 주어지며, 각 줄은 한 트리를 깊이 우선 순회(DFS)하면서 이동한 방향을 나타낸다. 트리 하나당 한 줄이다. 예를 들어 위 그림의 트리는 dudduduudu 로 표현되는데, 이는 "0에서 1로 내려가고, 1에서 0으로 올라오고, 0에서 2로 내려가고, ..." 를 뜻한다. 즉 d 는 자식으로 내려가는 것을, u 는 부모로 올라오는 것을 의미한다. 입력은 첫 글자가 # 인 줄로 끝난다. 각 트리의 노드 수는 2개 이상 10000개 이하이다.
각 트리에 대해, 위에서 설명한 변환 전과 변환 후의 트리 높이를 다음 형식으로 출력하라.
Tree t: h1 => h2
여기서 $t$ 는 (1부터 시작하는) 트리 번호, $h_1$ 은 변환 전 높이, $h_2$ 는 변환 후 높이이다.