#P16474. [SPOJ 4069]Morphing is Fun

[SPOJ 4069]Morphing is Fun

题目背景

花匠培育出了一种生长速度惊人的“变形树”。它只有一根竖直的树干,树干由许多大小相同的细胞自下而上堆叠而成。每个细胞都有一种颜色,而颜色决定了它在夜间会变成怎样的一段新细胞。

花匠想建一座固定高度的观测塔,通过观察树干底部的一段来判断树是否仍在继续发生变化。不过,有些变形规则会让树干不断生长,任意一个固定位置的颜色却最终不再改变。在这种情况下,无论塔建得多高,都无法可靠地判断树是否仍“活着”。

题目描述

共有 nn 种颜色,依次用小写字母 a 到第 nn 个小写字母表示。

对于每一种颜色,都给定一个非空字符串作为它的变形规则。字符串中的字符按从树干底部到顶部的顺序排列。

最初,树干只有一个颜色为 a 的细胞。每个夜晚,当前树干中的所有细胞会同时按照各自颜色的规则,被替换成对应的一段新细胞。

例如,若规则为:

  • a -> ab
  • b -> ca

则初始树干为 a,经过两个夜晚后依次变为:

a
ab
abca

为了描述高于树顶、尚不存在的位置,可以认为这些位置的状态是一个特殊的空白符。对于任意固定位置 kk,若从某一天开始,该位置的状态(某种颜色或空白)永远不再改变,则称第 kk 个位置最终稳定。

你需要判断:是否每一个固定位置都会最终稳定

  • 若是,则建造任何固定高度的观测塔都没有意义,输出 YES
  • 否则,存在某个固定位置会无限次改变颜色,输出 NO

输入格式

第一行包含一个整数 TT,表示测试用例数量。

对于每个测试用例:

  • 第一行包含一个整数 nn,表示颜色数量;
  • 接下来 nn 行,第 ii 行是第 ii 种颜色的变形规则。第 11 种颜色为 a,第 22 种颜色为 b,依此类推。

每条规则均为非空字符串,且只包含前 nn 个小写英文字母。

输出格式

对于每个测试用例输出一行:

  • 若每一个固定位置最终都会稳定,输出 YES
  • 否则输出 NO

样例输入

4
2
ab
a
3
ba
c
c
3
ba
c
b
3
bbbbbbbbbbbbbbb
ccccccccccccccc
c

样例输出

YES
YES
NO
YES

样例解释

对于第二组数据:

a -> ba
b -> c
c -> c

树干依次为:

a
ba
cba
ccba
cccba
...

对于任意固定位置,它最终都会变成 c,所以输出 YES

对于第三组数据,颜色 bc 会在树干底部不断交替,因此第一个位置永远不会稳定,输出 NO

数据范围

  • 1T100001 \le T \le 10000
  • 1n261 \le n \le 26
  • 每条变形规则的长度为 11100100
  • 每条规则只包含 a 到第 nn 个小写字母。