2938: [Poi2000]病毒

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 345  Solved: 176

[Submit][Status][Discuss]

Description

二进制病毒审查委员会近期发现了例如以下的规律:某些确定的二进制串是病毒的代码。

假设某段代码中不存在不论什么一段病毒代码,那么我们就称这段代码是安全的。如今委员会已经找出了全部的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。

演示样例:
比如假设{011, 11, 00000}为病毒代码段。那么一个可能的无限长安全代码就是010101…。假设{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。

任务:
请写一个程序:
l         读入病毒代码;
l         推断是否存在一个无限长的安全代码。
l         将结果输出

Input

 
第一行包含一个整数n,表示病毒代码段的数目。

下面的n行每一行都包含一个非空的01字符串——就是一个病毒代码段。

全部病毒代码段的总长度不超过30000。

Output

你应在在文本文件WIN.OUT的第一行输出一个单词:
l         TAK——假如存在这种代码;
l         NIE——假设不存在。

Sample Input

3

01

11

00000

Sample Output

NIE

HINT

Source

这道题的思路非常好

首先我们跑一次AC自己主动机。Trie树和失配边就构成了一个有向图。那么,能找到一个无限长的安全代码,当且仅当在非单词节点中存在环。用拓扑排序推断就可以。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define pa pair<int,int>
#define maxn 30100
#define inf 1000000000
using namespace std;
struct edge_type
{
int next,to;
}e[maxn*2];
int go[maxn],in[maxn],head[maxn],t[maxn][2];
int n,tot=1,cnt=0;
bool v[maxn];
char s[maxn];
inline void add_edge(int x,int y)
{
e[++cnt]=(edge_type){head[x],y};
head[x]=cnt;
}
inline void insert()
{
scanf("%s",s);
int len=strlen(s),now=1;
F(i,0,len-1)
{
int x=s[i]-'0';
if (!t[now][x]) t[now][x]=++tot;
now=t[now][x];
}
v[now]=true;
}
inline void bfs()
{
queue<int> q;
q.push(1);
while (!q.empty())
{
int x=q.front(),y,j;q.pop();v[x]|=v[go[x]];
F(i,0,1)
{
j=go[x];
while (j&&!t[j][i]) j=go[j];
if (t[x][i])
{
go[y=t[x][i]]=j?t[j][i]:1;
q.push(y);
}
else t[x][i]=j? t[j][i]:1;
}
}
}
inline bool topsort()
{
queue<int> q;
int sum=0;
F(i,1,tot)
{
if (v[i]) sum++;
else F(j,0,1) if (!v[t[i][j]])
{
add_edge(i,t[i][j]);
in[t[i][j]]++;
}
}
F(i,1,tot) if (!v[i]&&!in[i]) q.push(i);
while (!q.empty())
{
int x=q.front();q.pop();sum++;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
in[y]--;
if (!in[y]) q.push(y);
}
}
return sum==tot;
}
int main()
{
scanf("%d",&n);
F(i,1,n) insert();
bfs();
printf("%s\n",topsort()? "NIE":"TAK");
return 0;
}

bzoj2938【Poi2000】病毒的更多相关文章

  1. [bzoj2938][Poi2000]病毒_AC自动机

    病毒 bzoj-2938 Poi-2000 题目大意:给你n个01串,问是否存在一个无限长的01串使得这个01的任意子串都不等于给出的01串. 注释:All_length<=30,000 想法: ...

  2. BZOJ2938: [Poi2000]病毒(AC自动机)

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1678  Solved: 849[Submit][Status][D ...

  3. BZOJ2938 [Poi2000]病毒 和 BZOJ5261 Rhyme

    [Poi2000]病毒 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...

  4. bzoj2938: [Poi2000]病毒

    建AC自动机,把所有病毒的节点都删掉,dfs判有没有环,有环就找得到. #include <iostream> #include <cstdio> #include <c ...

  5. BZOJ2938[Poi2000]病毒——AC自动机

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...

  6. BZOJ2938:[POI2000]病毒(AC自动机)

    Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...

  7. BZOJ2938 [Poi2000]病毒 【AC自动机】

    题目 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否存在 ...

  8. BZOJ2938 POI2000病毒

    我们不能让重复过的字串出现在无限串上(就叫这个了...) 也就是要自动机一直能匹配但就是匹配不到,那么就是在自动机上找一个环. dfs判环即可.注意是个有向图. #include<bits/st ...

  9. 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS

    [BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...

  10. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 609  Solved: 318[Submit][Status][Di ...

随机推荐

  1. hdoj--5562--Clarke and food(模拟)

    Clarke and food Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. spring mvc给参数起别名

    需求: 将http报文请求(保护body和url)中的参数传递给Controller时支持使用别名. 举例: 下面两条请求报文的结果是一致的. http://example.com/foo?jobTy ...

  3. 在cncc的最后几天的笔记

    数据库范式:http://blog.csdn.net/fg2006/article/details/6936439 数据库事务隔离级别:http://blog.csdn.net/fg2006/arti ...

  4. HDU 1166 敌兵布阵(线段树单节点更新 区间求和)

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Dere ...

  5. BZOJ 3674: 可持久化并查集模板

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...

  6. nginx设置可以默认访问index.php

    vim /usr/local/nginx/conf/nginx.conf:      在 location /{                index index.php index.html i ...

  7. [NOIP2009提高组]最优贸易

    题目:洛谷P1073.Vijos P1754.codevs1173. 题目大意:有n点m边的图,边分有向和无向.每个点有一个价格,用这个价格可以买入或卖出一个东西.一个人从1出发,要到n,途中可以买入 ...

  8. Fans同学已死,终年24岁

    亲爱的同学们,朋友们,QQ好友. 告诉大家一个悲剧:Fans同学已死,终年24岁. 马甲变迁 正式告诉大家一个消息,我的ID"Fans同学"正在退出"历史舞台" ...

  9. 绿色版SecureCRT启动崩溃,遇到一个致命的错误且必须关闭

    百度搜了半天,大家都是说删除注册表的VanDyke就能解决问题,但是我用的是绿色版的,删除VanDyke后还不行. 然后试了一下重新解压出一个绿色版的SecureCRT,发现能用. 但之前我配置了很多 ...

  10. DevExpress控件的安装及画图控件的使用

    近期须要绘制纵断面图,而AE自带的又不是非常好,查找资料后使用DevExpress控件中的画图控件实现了纵断面的绘制.Dev控件是须要付费的.这里我们使用破解版的哈. 安装包及破解文件上传至我的网盘了 ...