#aCybttg020406. 1484:病毒

1484:病毒

好的,我将题目中的数字和名称用 ...... 标出。


题目描述

二进制病毒审查委员会发现某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么称这段代码是安全的。

现在委员会已经找出了所有的病毒代码段(每个病毒代码是一个非空 0101 字符串)。
问:是否存在一个无限长的二进制安全代码(即无限长的 0101 串,且它的任意连续子串都不是病毒代码)。

例如:

  • 病毒代码 {011,11,00000}\{011, 11, 00000\},那么一个可能的无限长安全代码是 010101010101\cdots
  • 病毒代码 {01,11,000000}\{01, 11, 000000\},那么不存在无限长的安全代码。

输入格式

第一行一个整数 nn,表示病毒代码段数目。
接下来 nn 行,每行一个非空的 0101 字符串(一个病毒代码)。

输出格式

一行一个单词:如果存在无限长安全代码,输出 TAKTAK(波兰语“是”);否则输出 NIENIE(波兰语“否”)。


数据范围

所有病毒代码段的总长度不超过 3×1043\times 10^4


输入样例

3
01 
11 
00000

输出样例

NIE

样例解释

病毒代码:0101, 1111, 0000000000
我们需要判断是否存在无限长的 0101 串,使得它的任何连续子串都不是这三个之一。

分析:

  • 如果串中有 1111,则含病毒 1111
  • 如果串中有 0101,则含病毒 0101
  • 所以只能由 0011 交替且不能出现 01011111,那只能是 11 后面不能跟 11,也不能有 0101,所以 11 后面只能跟 00,但 1010 可行吗?病毒里没有 1010。但 1010 后面如果是 00,就可能产生 0000,只要不是 0000000000 就可以。但我们必须检查无限长是否可能。

实际上,因为病毒包含 01011111,所以安全串里不能出现 01011111,这意味着 11 后面不能跟 11,也不能跟 00(因为 1010 不是病毒,但 1010 后如果是 11 就是 101101,如果 101101 中有 0101 吗?有 0101 在中间)。
更准确:病毒 0101 禁止了 0101 子串,所以串中任何 00 后面不能接 11
病毒 1111 禁止了 1111 子串。
所以 00 后面只能接 0011 后面只能接 00?不行,11 后面接 00 得到 1010,但 1010 不是病毒。
不过 00 后面不能接 11,所以 11 的前面不能是 00,因此 11 只能出现在开头,或者前面也是 11,但 1111 又禁止,所以 11 最多连续 11 个,并且 11 后面不能是 11,也不能是 00(因为 1010 是允许的)。等一下,1010 可以,因为 00 后面接 11 被禁止,但 11 后面接 00 是允许的。
那么可以构造 10001000\cdots110110 不行,111111 不行。
考虑可能的无限串:必须避免出现 010111110000000000

避免 0101 意味着 00 后不能有 11,所以所有 11 必须出现在开头且连续不超过 11 个,然后后面全 00,但 0000000000 不能出现,所以 00 的连续长度不超过 44
这样串长有限,不能无限长。
因此不存在无限长安全代码。

输出 NIENIE


这样题目就完整了,所有数字和名称都用 ...... 标出。