트리 유사도

아직 제출이 없습니다시간 제한3초메모리 제한128 MB

문제

숫자가 적혀 있는 순서 있는 루트 트리(labeled ordered rooted tree) 두 개 TTTT'가 주어진다. 두 트리 사이의 거리를 구하는 프로그램을 작성하시오. 거리란 TTTT'와 동등하게 만드는 데 필요한 최소 연산 횟수이다.

연산은 다음 세 가지이다.

  1. TT의 한 노드에 적힌 숫자를 다른 숫자로 바꾼다.
  2. TT에서 루트가 아닌 노드 하나를 삭제한다.
  3. TT의 루트 아래 어딘가에 노드 하나를 삽입한다.

TTTT'는 순서 있는 트리이므로, 리프가 아닌 노드가 자식을 cc개 가지면 그 자식들에는 1번째부터 cc번째까지 순서가 정해져 있다.

두 트리 XXYY가 동등하려면, 두 루트에 같은 숫자가 적혀 있고 자식의 개수가 같아야 하며, 각 ii에 대해 XXii번째 자식을 루트로 하는 서브트리와 YYii번째 자식을 루트로 하는 서브트리가 서로 동등해야 한다. (i=1,2,,ci = 1, 2, \dots, c)

삭제와 삽입은 다음과 같이 정의된다. 루트가 아닌 노드 ww가 자식을 dd개 가지고, ww의 부모가 uu이며 wwuuii번째 자식이라고 하자. ww를 삭제하면 ww의 자식들이 ww가 있던 자리로 올라온다. 즉 ww의 첫 번째 자식이 uuii번째 자식이 되고, 두 번째 자식이 uu(i+1)(i+1)번째 자식이 되는 식이다. uu의 자식 중 j<ij < ijj번째 자식은 순서가 그대로 유지되고, j>ij > ijj번째 자식은 모두 uu(j+d1)(j + d - 1)번째 자식으로 밀려난다.

루트가 아닌 노드 ww를 삽입하려면 먼저 ww의 부모가 될 노드 uu를 고른다. 그런 다음 uu의 자식 중에서 연속한 부분 수열을 골라 ww의 자식으로 만들고, 그 자리에 ww를 끼워 넣는다. 삽입할 때 ww에는 원하는 숫자를 적을 수 있다.

TT의 루트를 삭제하거나 루트 위에 새 노드를 삽입하는 것은 불가능하다. 단, 루트에 적힌 숫자는 바꿀 수 있다.

(예를 들어, 노드 ww를 삭제하는 연산과, uu의 2번째 자식부터 4번째 자식까지를 새 노드 ww의 자식으로 묶어 uu 아래에 ww를 삽입하는 연산을 생각할 수 있다.)

입력

첫째 줄에 두 트리 TTTT'의 노드 개수 nn, mm이 주어진다. (1n,m601 \le n, m \le 60)

이어지는 nn개의 줄에는 TT의 정보가 주어진다. 노드는 00번부터 n1n-1번까지 번호가 매겨지며, 이 nn개 줄 중 (i+1)(i+1)번째 줄에 노드 ii의 정보가 주어진다. 각 줄에는 그 노드에 적힌 숫자와 자식의 수가 주어지고, 이어서 자식 노드의 번호가 순서대로 주어진다(번호는 00부터 시작한다).

그다음 mm개의 줄에는 같은 형식으로 TT'의 정보가 주어진다.

노드에 적힌 숫자는 항상 음이 아닌 정수이며, 각 트리의 루트는 다른 어떤 노드의 자식도 아닌 노드이다.

출력

TTTT'와 동등하게 만드는 데 필요한 최소 연산 횟수를 출력한다.