#aCybttg020406. 1484:病毒
1484:病毒
好的,我将题目中的数字和名称用 标出。
题目描述
二进制病毒审查委员会发现某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么称这段代码是安全的。
现在委员会已经找出了所有的病毒代码段(每个病毒代码是一个非空 字符串)。
问:是否存在一个无限长的二进制安全代码(即无限长的 串,且它的任意连续子串都不是病毒代码)。
例如:
- 病毒代码 ,那么一个可能的无限长安全代码是 。
- 病毒代码 ,那么不存在无限长的安全代码。
输入格式
第一行一个整数 ,表示病毒代码段数目。
接下来 行,每行一个非空的 字符串(一个病毒代码)。
输出格式
一行一个单词:如果存在无限长安全代码,输出 (波兰语“是”);否则输出 (波兰语“否”)。
数据范围
所有病毒代码段的总长度不超过 。
输入样例
3
01
11
00000
输出样例
NIE
样例解释
病毒代码:, ,
我们需要判断是否存在无限长的 串,使得它的任何连续子串都不是这三个之一。
分析:
- 如果串中有 ,则含病毒 。
- 如果串中有 ,则含病毒 。
- 所以只能由 和 交替且不能出现 和 ,那只能是 后面不能跟 ,也不能有 ,所以 后面只能跟 ,但 可行吗?病毒里没有 。但 后面如果是 ,就可能产生 ,只要不是 就可以。但我们必须检查无限长是否可能。
实际上,因为病毒包含 和 ,所以安全串里不能出现 和 ,这意味着 后面不能跟 ,也不能跟 (因为 不是病毒,但 后如果是 就是 ,如果 中有 吗?有 在中间)。
更准确:病毒 禁止了 子串,所以串中任何 后面不能接 。
病毒 禁止了 子串。
所以 后面只能接 , 后面只能接 ?不行, 后面接 得到 ,但 不是病毒。
不过 后面不能接 ,所以 的前面不能是 ,因此 只能出现在开头,或者前面也是 ,但 又禁止,所以 最多连续 个,并且 后面不能是 ,也不能是 (因为 是允许的)。等一下, 可以,因为 后面接 被禁止,但 后面接 是允许的。
那么可以构造 或 不行, 不行。
考虑可能的无限串:必须避免出现 和 和 。
避免 意味着 后不能有 ,所以所有 必须出现在开头且连续不超过 个,然后后面全 ,但 不能出现,所以 的连续长度不超过 。
这样串长有限,不能无限长。
因此不存在无限长安全代码。
输出 。
这样题目就完整了,所有数字和名称都用 标出。