描述
二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。 示例:
例如如果{011, 11, 00000}为病毒代码段,那么一个可能的无限长安全代码就是010101…。如果{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。
任务:
请写一个程序:
-
读入病毒代码;
-
判断是否存在一个无限长的安全代码;
-
将结果输出
输入
第一行包括一个整数n,表示病毒代码段的数目。以下的n行每一行都包括一个非空的01字符串——就是一个病毒代码段。所有病毒代码段的总长度不超过30000。
输出
你应在在文本文件WIN.OUT的第一行输出一个单词:
-
TAK——假如存在这样的代码;
-
NIE——如果不存在。
样例输入
3
01
11
00000
样例输出
NIE
网上找的:`
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5,N=3e4+5;
int n,siz=1/*1为根节点*/,ch[N][2],val[N],fail[N];
char s[N];
void insert(){
int len=strlen(s+1);
int p=1;
for(int i=1;i<=len;i++){
int c=s[i]-'0';
if(!ch[p][c])ch[p][c]=++siz;
p=ch[p][c];
}
val[p]++;
}
void getfail(){
queue<int>q;
fail[1]=0;//节点1的fail指针指向虚根0号节点
for(int i=0;i<=1;i++)
if(ch[1][i]){
//目标节点存在
fail