一个未公开名称的秘密社团成立于 1899 年,由一位创始人创立,其姓名也保密。后续成员通过现有成员的推荐加入该社团。
加入该社团有一条独特的规则被严格执行:推荐可以由一名或多名现有成员共同做出,但同一成员组只能推荐一名新成员。例如,如果某成员在现有成员组 $\{A, B, C\}$ 的推荐下获准加入,则其他任何人不得再由该推荐组推荐加入。然而,由 $\{A, B\}$ 组成的组推荐另一名新成员是完全可以接受的。尽管 $\{A, B\}$ 是 $\{A, B, C\}$ 的子集,但它们是不同的集合。为保持一致性,创始人的推荐组被视为空集。
通过对该秘密社团的调查,你获得了一些信息片段,代表了该社团成员结构的一部分。每个信息片段采用以下形式的陈述之一,其中符号 $a, b$ 和 $c$ 是代表社团中特定成员的整数。
recommend a b
意为成员 $a$ 属于推荐成员 $b$ 加入的那个组。
not-recommend a b
意为成员 $a$ 不属于推荐成员 $b$ 加入的那个组。
intersection a b c
意为成员 $a$ 的推荐组是成员 $b$ 的推荐组与成员 $c$ 的推荐组的集合交集。换句话说,所有推荐 $a$ 的人同时也推荐了 $b$ 和 $c$,且所有同时推荐了 $b$ 和 $c$ 的人也都推荐了 $a$。
同一个整数的两次或多次出现代表同一个成员,即使在不同的陈述中也是如此。另一方面,两个或多个不同的整数可能是同一个人的别名,即使在单个陈述中也是如此。
所获得的信息可能是局部的,即某些成员的推荐情况可能缺失,此外,可能还有一些成员未在任何陈述中提及。
由于信息来源不一定可靠,可能混入了一些虚假信息。你想要知道这些陈述是否一致,即是否存在一种符合所有这些陈述的推荐关系。
输入格式
输入包含一个或多个测试用例。输入的第一行包含一个整数 $t$ ($1 \le t \le 3000$),表示测试用例的数量。接下来是 $t$ 个测试用例的描述,每个测试用例格式如下:
$n$ $s_1$ $\vdots$ $s_n$
第一行包含一个整数 $n$,表示陈述的数量 ($1 \le n \le 3000$)。接下来的 $n$ 行中,每一行都是 “recommend a b”、“not-recommend a b” 或 “intersection a b c” 格式之一,其中 $a, b$ 和 $c$ 均为 $1$ 到 $3n$ 之间的整数(包含边界)。
所有测试用例的 $n$ 之和不超过 3000。
输出格式
对于每个测试用例,如果陈述中描述的情况是可能的,则在一行中输出 yes,否则输出 no。
样例
输入 1
3 2 recommend 1 2 not-recommend 1 2 2 recommend 1 2 recommend 2 1 3 intersection 1 2 2 recommend 1 3 not-recommend 2 3
输出 1
no no no
输入 2
4 3 intersection 3 2 1 recommend 3 2 not-recommend 3 1 4 intersection 1 2 3 recommend 4 2 recommend 4 3 not-recommend 4 1 3 intersection 3 2 1 recommend 2 5 intersection 3 4 5 5 recommend 1 3 not-recommend 2 3 not-recommend 3 2 not-recommend 1 2 not-recommend 2 1
输出 2
yes no yes yes
说明
在样例输入 1 中,所有测试用例描述的情况都是不可能的。
- 在第一个测试用例中,两条陈述显然相互矛盾。
- 在第二个测试用例中,第一条陈述暗示成员 1 先加入社团,随后成员 2 加入,因为否则成员 1 不可能推荐成员 2。然而,第二条陈述暗示了相反的顺序。同时满足这两者是不可能的。
- 在第三个测试用例中,第一条陈述本质上说成员 1 的推荐集与成员 2 的推荐集相同。由于没有两个成员拥有相同的推荐集,因此 1 和 2 必须指代同一个成员。那么,第二条和第三条陈述就是矛盾的。
样例输入 2 的第一个测试用例是可能的。有许多可能的场景。一个例子如下:成员 3 实际上是创始人,成员 2 在 $\{3\}$ 的推荐下加入,成员 1 在 $\{2\}$ 的推荐下加入。
样例输入 2 的最后一个测试用例也是可能的。注意,社团中的所有成员不一定都要在信息中提及。社团中至少必须有 4 名成员。