멈추는 늑대
시간 제한1초메모리 제한1024 MB
유한 점프와 무한 점프로 이루어진 프로그램에서 명령 1이 최대 몇 번 실행되는지 구하거나, 무한히 실행되는 경우를 판별합니다.
문제
Senoof는 프로그래밍 언어를 좋아하고, 그 언어를 쓰는 것보다 새로 만드는 것을 더 좋아한다. 그의 최신 발명품은 Wolf Programming Language이다. 명령어가 두 종류뿐인 아주 단순한 언어다. 명령어에는 번호가 차례로 붙고, 한 줄에 하나씩 위에서 아래로 적어 프로그램을 만든다. 실행은 1번 명령어에서 시작해 프로그램이 멈출 때까지 계속된다.
명령어는 두 종류다.
K L1 L2 ... LK는 유한 점프다. 각 값 Li는 프로그램 안의 명령어 번호이고, K는 주어진 값의 개수다. 유한 점프를 실행하면 값 Li 중 하나를 골라 그 번호의 명령어로 이동한다. 이어서 프로그램은 고른 값을 소비하도록 그 유한 점프를 고친다. 남은 값이 없는 유한 점프를 실행하면 프로그램은 멈춘다.* L은 무한 점프다. 실행하면 명령어 L로 이동하고, 무한 점프 명령어 자체는 바뀌지 않는다.
예를 들어 아래 (a)의 프로그램에서 실행은 유한 점프인 1번 명령어에서 시작한다. 두 번째 값을 골랐다고 하면 2번 명령어로 이동하고, 그 값은 1번 명령어에서 소비되어 상태 (b)가 된다. 2번은 3번으로 가는 무한 점프이므로 아무 값도 소비하지 않고 3번으로 간다. 3번에서 4번으로, 다시 1번으로, 또 1번으로 이동하며 그때마다 값을 소비한다. 이 시점에 1번에는 남은 값이 없어서 상태 (c)처럼 프로그램이 멈춘다.
(a)
1: 2 1 2
2: * 3
3: 3 4 3 4
4: 2 1 1
Senoof가 보내 준 다음 프로그램은 영원히 실행될 수 있지만, 1번 명령어는 최대 두 번만 실행된다. 즉 어떤 명령어도 무한히 실행되지 않으면서 프로그램이 영원히 돌 수 있다.
1: 2 1 2
2: * 4
3: 3 4 3 4
4: * 2
입력
첫 줄에 명령어의 개수 ()이 주어진다. 다음 개의 줄은 각각 명령어 하나를 나타낸다. 유한 점프는 0 이상의 정수 와 그 뒤에 이어지는 개의 정수 ()로 적는다. 무한 점프는 문자 *와 그 뒤의 정수 ()로 적는다. 모든 유한 점프에 나열되는 값의 총합 개수는 이하다.
출력
명령어 1을 실행할 수 있는 최대 횟수를 한 줄에 정수로 출력한다. 명령어 1을 무한히 실행할 수 있으면 대신 문자 *를 출력한다.