만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

멀티스레드 프로그램

면접 대비

시간 제한2초메모리 제한512 MB

요약
스레드별 대입 순서와 변수의 최종 값이 주어질 때, 모든 대입을 실행해 그 값을 만족하는 실행 순서가 있는지 판단하고, 있으면 그중 하나를 출력합니다.
난이도

보통10점 중 6점

유형
그리디, 위상 정렬
정답자
아직 제출이 없습니다

문제

모리스는 낡은 컴퓨터에서 멀티스레드 프로그램을 디버깅하고 있다. 프로그램에는 공유 변수 집합을 조작하는 여러 스레드가 있다. 각 스레드는 미리 정해진 프로그램 순서대로 자신의 대입문 시퀀스를 실행한다. 각 대입문은 변수 하나를 정수 값으로 설정한다.

프로그램을 실행할 때 서로 다른 스레드의 대입문은 어떤 순서로든 실행될 수 있다. 보장되는 것은 각 스레드가 자신의 모든 대입문을 프로그램 순서대로 실행한다는 것뿐이다.

예를 들어 프로그램에 대입문이 각각 22, 22, 11개인 스레드 세 개가 있다고 하자. 그러면 한 가지 올바른 실행은 다음과 같다.

  • 스레드 11이 자신의 시퀀스에서 첫 번째 대입문을 실행한다.
  • 스레드 22가 자신의 시퀀스에서 첫 번째 대입문을 실행한다.
  • 스레드 22가 자신의 시퀀스에서 두 번째 대입문을 실행한다.
  • 스레드 11이 자신의 시퀀스에서 두 번째 대입문을 실행한다.
  • 스레드 33이 자신의 시퀀스에서 유일한 대입문을 실행한다.

이 실행은 1,2,2,1,31, 2, 2, 1, 3으로 나타낼 수 있다. 여기서 숫자는 각 대입문을 수행하는 스레드를 순서대로 나타낸다. 다른 올바른 실행도 많이 존재한다.

모리스는 자신의 컴퓨터가 고장 나서 잘못 동작할 수 있다고 의심한다. 그는 프로그램을 실행한 뒤 모든 변수의 최종 값을 기록했다.

모든 대입문을 수행하고 기록된 모든 변수 값을 만드는 프로그램 실행을 찾거나, 컴퓨터가 실제로 고장 나서 그러한 실행이 존재하지 않는다고 보고하시오.

입력

첫 줄에는 정수 tt가 주어진다. tt는 스레드의 수이다 (1≤t≤1001 \leq t \leq 100). 스레드는 11부터 tt까지 번호가 매겨진다. 다음 줄들에는 스레드마다 하나씩, tt개의 대입문 시퀀스가 주어진다.

ii번째 설명의 첫 줄에는 정수 lil_i가 주어진다. lil_i는 ii번째 스레드의 대입문 시퀀스 길이이다 (1≤li≤1001 \leq l_i \leq 100). 이어지는 lil_i개의 줄 각각에는 <variable>=<value> 형식의 대입문이 주어진다. 대입문은 프로그램 순서대로 나열된다. 변수 이름은 길이가 최대 1010인 영문 소문자로 이루어지고, 값은 10910^9 이하의 양의 정수이다.

나머지 줄의 첫 줄에는 정수 kk가 주어진다. kk는 변수의 수이다 (1≤k≤10 0001 \le k \le 10\,000). 이어지는 kk개의 줄 각각에는 변수 이름과 기록된 값이 주어지며, 값은 10910^9 이하의 양의 정수이다. 프로그램에서 사용되는 각 변수는 정확히 한 번 나열되고, 나열된 각 변수는 적어도 하나의 대입문에서 사용된다.

출력

기록된 값을 만드는 실행이 존재하면 Yes를 출력하고, 그렇지 않으면 No를 출력한다.

실행이 존재하면 s=l1+l2+⋯+lts = l_1 + l_2 + \dotsb + l_t개의 정수 c1,c2,…,csc_1, c_2, \ldots, c_s를 한 줄에 출력한다. 이 정수들은 그러한 실행 하나를 나타낸다 (1≤ci≤t1 \le c_i \le t). 첫 번째 대입문은 스레드 c1c_1이, 두 번째 대입문은 스레드 c2c_2가 수행한다는 식이다. 각 스레드는 자신의 대입문을 프로그램 순서대로 수행한다. ss번째 대입문이 끝난 뒤 각 변수는 기록된 값을 가져야 한다. ii번째 스레드는 출력에서 정확히 lil_i번 나타나야 한다.

예제2

  1. 예제 1

    입력
    2
    2
    a=1
    b=2
    2
    b=1
    a=2
    2
    a 1
    b 1
    
    예상 출력
    No
    
  2. 예제 2

    입력
    3
    5
    start=1
    counter=1111
    counter=10
    counter=3333
    finish=1
    4
    start=2
    counter=20
    counter=10
    finish=2
    3
    start=3
    qwerty=787788
    finish=3
    4
    counter 10
    start 1
    finish 1
    qwerty 787788
    
    예상 출력
    Yes
    2 3 3 2 1 1 3 1 1 2 2 1