#P13640. [NWRRC 2021] Multithreaded Program
[NWRRC 2021] Multithreaded Program
Description
Maurice 正在他的老旧机器上调试一个多线程程序。该程序有若干线程操作一组共享变量。每个线程按照预定的“程序顺序”执行自己的赋值序列。每次赋值会将某个变量设置为一个整数值。
当程序运行时,不同线程的赋值可以以任意顺序执行。唯一的保证是,每个线程内部的赋值必须按照程序顺序依次执行。
例如,假设程序有三个线程,它们的赋值序列长度分别为 、 和 。那么一种合法的程序执行顺序如下:
- 线程 执行其序列中的第一个赋值;
- 线程 执行其序列中的第一个赋值;
- 线程 执行其序列中的第二个赋值;
- 线程 执行其序列中的第二个赋值;
- 线程 执行其唯一的赋值。
这种执行顺序可以描述为 ,其中数字表示每一步执行赋值的线程编号。注意,还存在许多其他合法的执行顺序。
Maurice 怀疑他的机器有故障,可能会出现错误的行为。他已经运行了程序,并记录了所有变量在结束时的值。
请你找出一种执行顺序,使得所有赋值都被执行,并且最终所有变量的值与记录一致;或者报告机器确实有故障,不存在这样的执行顺序。
Input Format
第一行包含一个整数 ,表示线程数()。线程编号为 到 。接下来的 段描述每个线程的赋值序列,每段一行。
第 段的第一行包含一个整数 ,表示第 个线程的赋值序列长度()。接下来的 行,每行包含一个赋值,格式为 . 这些赋值按照程序顺序给出。变量名由不超过 个小写英文字母组成,赋值为不超过 的正整数。
剩下的第一行包含一个整数 ,表示变量的数量()。接下来的 行,每行包含一个变量名和其记录的值,均为不超过 的正整数。每个在程序中出现过的变量恰好出现一次,且每个列出的变量至少在某个赋值中被使用过。
Output Format
如果存在一种执行顺序能得到记录的变量值,输出 ;否则输出 。
如果存在可行的执行顺序,输出一行 个整数 ,描述一种合法的执行顺序()。这表示第 步执行赋值的线程编号为 。每个线程的赋值必须按照程序顺序依次执行。第 个线程在序列中恰好出现 次。执行完第 步后,每个变量的值必须与记录值一致。
2
2
a=1
b=2
2
b=1
a=2
2
a 1
b 1
No
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
Hint
由 ChatGPT 4.1 翻译
京公网安备 11011102002149号