形式文法是一种描述形式语言的方法,表示为 $\Gamma = (\Sigma, N, S \in N, P \subset N^+ \times (\Sigma \cup N)^*)$,其中 $\Sigma$ 称为字母表,其元素称为终结符,$N$ 是非终结符的集合,$S$ 是起始非终结符,而 $P$ 是形如 $\alpha \to \beta$ 的产生式规则集合。
这里,$N^+$ 包含所有由一个或多个 $N$ 中的元素组成的字符串(非空的非终结符字符串),而 $(\Sigma \cup N)^*$ 包含所有由零个、一个或多个 $(\Sigma \cup N)$ 中的元素组成的字符串(由终结符和非终结符组成的字符串,包括空串)。
如果每个产生式规则的左侧都恰好由一个非终结符组成,则该文法被称为上下文无关文法,更形式化地,即 $P \subset N \times (\Sigma \cup N)^*$。
例如,让我们考虑第二个样例测试用例中的文法,其字母表为 $\Sigma = \{a, b\}$,非终结符集合为 $N = \{S, A\}$,以及两条产生式规则:
- $S \to bA$
- $A \to aa$
很容易看出这是一个上下文无关文法。
要创建由文法生成的语言,需要从仅包含起始非终结符 $S$ 的字符串开始,然后应用一次或多次产生式规则。应用产生式规则是指在当前字符串中找到该规则的左侧,并将其替换为该规则右侧的字符串。由 $\Gamma$ 生成的语言是通过应用一次或多次产生式规则所能产生的所有仅由终结符组成的字符串的集合。
例如,在上述文法生成的语言中有一个字符串 baa。为了生成它,可以应用产生式 $S \to bA \to baa$。该文法生成的语言中没有其他字符串。
有些文法甚至可能生成无限语言,而另一些则可能生成空语言。
给你一个上下文无关文法,其字母表由两个终结符 "a" 和 "b" 组成。你的任务是检查该文法生成的语言中是否包含一个字符 "a" 的数量严格多于字符 "b" 的数量的字符串。
在本题中,非终结符从 $1$ 到 $n$ 进行编号。起始非终结符的编号总是 $1$。
输入格式
输入包含一个或多个测试用例。
每个测试用例的第一行包含两个整数 $n$ 和 $m$:非终结符的数量和产生式规则的数量($1 \le n \le 100$,$1 \le m \le 50\,000$)。
接下来的 $m$ 行中,每行按以下方式描述一条产生式规则。首先给出 $A_i$ 和 $k_i$:左侧非终结符的编号($1 \le A_i \le n$)和产生式规则右侧的字符数量($0 \le k_i \le 100$)。接着是 $k_i$ 个对象,每个对象要么是一个非终结符 $B_{i,j}$($1 \le B_{i,j} \le n$),要么是一个终结符 "a" 或 "b"。相邻的字符之间用单个空格分隔。
所有测试用例中 $n$ 的总和不超过 $1000$。所有测试用例中 $m$ 的总和不超过 $50\,000$。输入文件的大小不超过 5 MB。
输入以一行两个零结束。
输出格式
对于每个测试用例,输出单独的一行。如果给定的文法生成的语言中包含一个字符 "a" 的数量严格多于字符 "b" 的数量的字符串,则该行必须包含 "YES",否则该行必须包含 "NO"。
样例
输入样例 1
2 2 1 2 a 2 2 1 b 2 2 1 2 b 2 2 2 a a 2 2 1 2 b 2 2 3 a a 1 0 0
输出样例 1
NO YES NO