[POI2000]病毒
题目描述:
二进制病毒审查委员会最近发现了如下的规律:
某些确定的二进制串是病毒的代码。
如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。
现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。
示例:如果{011, 11, 00000}为病毒代码段,
那么一个可能的无限长安全代码就是010101…。
如果{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。
任务:请写一个程序:
读入病毒代码,判断是否存在一个无限长的安全代码;
输入格式:
在文本文件WIR.IN的第一行包括一个整数n (n≤2000) ,表示病毒代码段的数目。
以下的n行每一行都包括一个非空的01字符串——就是一个病毒代码段。
所有病毒代码段的总长度不超过30000。
输出格式:
输出:
TAK——假如存在这样的代码;
NIE——如果不存在。
非常基础的AC自动机,考验理解。
能在AC自动机中转移 ---> 可以添加字符
因此 长度无限的字符串 ---> 能在AC自动机中无限地转移 --> AC自动机中有环
但注意到一些病毒串无法被匹配;
将代表病毒串的结尾的节点及其后继fail节点全部打上标记即可。