숫자가 적혀 있는 순서 있는 루트 트리(labeled ordered rooted tree) 두 개 T와 T′가 주어진다. 두 트리 사이의 거리를 구하는 프로그램을 작성하시오. 거리란 T를 T′와 동등하게 만드는 데 필요한 최소 연산 횟수이다.
연산은 다음 세 가지이다.
T와 T′는 순서 있는 트리이므로, 리프가 아닌 노드가 자식을 c개 가지면 그 자식들에는 1번째부터 c번째까지 순서가 정해져 있다.
두 트리 X와 Y가 동등하려면, 두 루트에 같은 숫자가 적혀 있고 자식의 개수가 같아야 하며, 각 i에 대해 X의 i번째 자식을 루트로 하는 서브트리와 Y의 i번째 자식을 루트로 하는 서브트리가 서로 동등해야 한다. (i=1,2,…,c)
삭제와 삽입은 다음과 같이 정의된다. 루트가 아닌 노드 w가 자식을 d개 가지고, w의 부모가 u이며 w가 u의 i번째 자식이라고 하자. w를 삭제하면 w의 자식들이 w가 있던 자리로 올라온다. 즉 w의 첫 번째 자식이 u의 i번째 자식이 되고, 두 번째 자식이 u의 (i+1)번째 자식이 되는 식이다. u의 자식 중 j<i인 j번째 자식은 순서가 그대로 유지되고, j>i인 j번째 자식은 모두 u의 (j+d−1)번째 자식으로 밀려난다.
루트가 아닌 노드 w를 삽입하려면 먼저 w의 부모가 될 노드 u를 고른다. 그런 다음 u의 자식 중에서 연속한 부분 수열을 골라 w의 자식으로 만들고, 그 자리에 w를 끼워 넣는다. 삽입할 때 w에는 원하는 숫자를 적을 수 있다.
T의 루트를 삭제하거나 루트 위에 새 노드를 삽입하는 것은 불가능하다. 단, 루트에 적힌 숫자는 바꿀 수 있다.
(예를 들어, 노드 w를 삭제하는 연산과, u의 2번째 자식부터 4번째 자식까지를 새 노드 w의 자식으로 묶어 u 아래에 w를 삽입하는 연산을 생각할 수 있다.)
첫째 줄에 두 트리 T와 T′의 노드 개수 n, m이 주어진다. (1≤n,m≤60)
이어지는 n개의 줄에는 T의 정보가 주어진다. 노드는 0번부터 n−1번까지 번호가 매겨지며, 이 n개 줄 중 (i+1)번째 줄에 노드 i의 정보가 주어진다. 각 줄에는 그 노드에 적힌 숫자와 자식의 수가 주어지고, 이어서 자식 노드의 번호가 순서대로 주어진다(번호는 0부터 시작한다).
그다음 m개의 줄에는 같은 형식으로 T′의 정보가 주어진다.
노드에 적힌 숫자는 항상 음이 아닌 정수이며, 각 트리의 루트는 다른 어떤 노드의 자식도 아닌 노드이다.
T를 T′와 동등하게 만드는 데 필요한 최소 연산 횟수를 출력한다.