#P16586. [GKS 2016 #C] Evaluation

[GKS 2016 #C] Evaluation

题目描述

给定一个无序的赋值语句列表,请编写一个程序,判断是否存在某种顺序,使得所有变量都能被求值。

在我们的问题中,一条赋值语句依次由赋值变量、赋值运算符和表达式组成。语句将按照你选择的顺序逐条求值。一个变量当且仅当它先前已经成为某条赋值语句的赋值变量时,才可以被求值。

为简化问题,所有表达式都是单个函数调用。函数可以接受任意数量的参数(包括零个);参数个数为零的函数总是合法的,而带变量参数的函数,仅当所有变量均可求值时才是合法的。

例如,对于以下赋值语句列表:

a = f(b, c)
b = g()
c = h()

下面这个顺序使得每条语句都合法:

b = g()
c = h()
a = f(b, c)

这是因为:(1)b 和 c 可以被求值,因为表达式 g()h() 不依赖于任何变量;(2)a 也可以被求值,因为表达式 a 依赖于 b 和 c,而 b 和 c 是可求值的。

然而,顺序

b = g()
a = f(b, c)
c = h()

是不合法的,因为 f(b, c) 的参数中包含变量 c,而变量 c 尚未成为赋值变量。

再举一例:a = f(a)。这个语句列表无法被求值,因为表达式 f(a) 依赖于变量 a 本身,导致无法求值该语句。

输入格式

输入的第一行给出测试用例的数量 TT。接下来有 TT 个测试用例。每个测试用例的第一行包含一个整数 NN:赋值语句的条数。随后 NN 行,每行包含一条赋值语句。

每条赋值语句由三部分组成:赋值变量、赋值运算符和表达式,中间没有空格。赋值运算符始终为 =。所有表达式均由一个函数名,后跟 (,再跟零个或多个由逗号分隔的变量名,最后跟 ) 构成。所有变量名和函数名均由一个或多个小写英文字母组成。没有变量名与函数名相同。没有变量会作为赋值变量出现多次。然而,变量可以在不同函数中(甚至同一函数内)出现多次,函数也可以出现多次。

输出格式

对于每个测试用例,输出一行,格式为 Case #x: y,其中 xx 是测试用例编号(从 11 开始),yy 是所有变量均可求值时的 GOOD,否则输出 BAD

4
3
a=f(b,c)
b=g()
c=h()
2
a=f(b)
b=f(a)
2
aaa=foo(x,y)
bbb=bar(aaa,bbb)
2
x=f()
y=g(x,x)
Case #1: GOOD
Case #2: BAD
Case #3: BAD
Case #4: GOOD

提示

限制条件

1T201 \le T \le 20

所有函数的参数个数在 001010 之间(包含端点)。所有变量名由 112020 个小写英文字母组成。

小数据集(测试集 1 – 可见)

1N1001 \le N \le 100

大数据集(测试集 2 – 隐藏)

1N10001 \le N \le 1000

翻译由 DeepSeek V4 Pro 完成