记录编号 157189 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [POI 2000]病毒 最终得分 100
用户昵称 Gravatar清羽 是否通过 通过
代码语言 C++ 运行时间 0.030 s
提交时间 2015-04-08 06:38:27 内存使用 0.92 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;

const int maxnode=30050;
const int sigma_size=2;

bool val[maxnode],have_cycle;
int n,sz,vis[maxnode],ch[maxnode][sigma_size],f[maxnode],last[maxnode];

int idx(int x)
{
	return x-'0';
}

void insert(char* s)
{
	int u=0,n=strlen(s);
	for(int i=0;i<n;i++){
		int v=idx(s[i]);
		if(!ch[u][v]) ch[u][v]=++sz;
		u=ch[u][v];
	}
	val[u]=true;
}

void GetFail()
{
	queue<int> q;
	for(int i=0;i<sigma_size;i++){
		int u=ch[0][i];
		if(u){
			q.push(u);last[u]=0;f[u]=0;
		}
	}
	while(!q.empty()){
		int u=q.front(); q.pop();
		for(int i=0;i<sigma_size;i++){
			int v=ch[u][i],j=f[u];
			if(!v){
				ch[u][i]=ch[f[u]][i];
				continue;
			}
			q.push(v);
			while(j && !ch[j][i]) j=f[j];
			f[v]=ch[j][i];
			last[v]=val[f[v]]?f[v]:last[f[v]];
		}
	}
}

bool dfs(int u)
{
 	vis[u]=-1;
 	for(int i=0;i<sigma_size;i++){
 		int v=ch[u][i];
 		if(last[v] || val[v] || vis[v]==1) continue;
 		if(vis[v]==-1) return true;	
 		if(dfs(v)) return true;
	}
	vis[u]=1;
	return false;
}

void init()
{
	memset(f,0,sizeof(f));
	memset(last,0,sizeof(last));
	memset(val,false,sizeof(val));
	sz=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		char s[30050];
		scanf("%s",s);
		insert(s);
	}
	GetFail();
}

void work()
{
	memset(vis,0,sizeof(vis));
	have_cycle=false;
	if(dfs(0)) printf("TAK");
	else printf("NIE");
}

int main()
{
	freopen("wir.in","r",stdin);
	freopen("wir.out","w",stdout);
	init();
	work();
	fclose(stdin);
	fclose(stdout);
	return 0;
}