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

时间:2021-11-12 00:06:43

2938: [Poi2000]病毒

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 609  Solved: 318
[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

Solution

Trie图的一大经典应用。

要构造一个无限长的安全串,显然是需要找至少一个安全的子串,然后循环下去,问题在于是否存在这样的子串。

建出Trie图之后,满足条件的子串必须在Trie图上不断匹配,而且不断失配无法达到危险节点。

这就说明,Trie图中存在不经过危险节点的环! 然后进行拓扑排序即可。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 30010
int N;
char s[MAXN];
struct EdgeNode{int next,to;}edge[MAXN<<];
int head[MAXN],cnt=,d[MAXN],visit[MAXN];
inline void AddEdge(int u,int v) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v;}
inline void InsertEdge(int u,int v) {AddEdge(u,v); d[v]++; /*printf("%d ---> %d\n",u,v);*/}
namespace ACMachine
{
#define id(s) s-'0'
int son[MAXN][],end[MAXN],sz=,fail[MAXN];
inline void Insert(char str[])
{
int len=strlen(str+),now=;
for (int i=; i<=len; i++)
if (son[now][id(str[i])]) now=son[now][id(str[i])];
else son[now][id(str[i])]=++sz,now=sz;
end[now]=;
}
inline void Getfail()
{
queue<int>q; q.push();
while (!q.empty())
{
int now=q.front(); q.pop();
end[now]|=end[fail[now]];
for (int i=; i<=; i++)
{
int fa=fail[now];
while (fa && !son[fa][i]) fa=fail[fa];
if (son[now][i])
fail[son[now][i]]=fa? son[fa][i]:,q.push(son[now][i]);
else son[now][i]=fa? son[fa][i]:;
}
}
}
}
using namespace ACMachine;
inline bool Topo()
{
queue<int>q;
int sum=;
for (int i=; i<=sz; i++)
{
if (end[i]) sum++; else
for (int j=; j<=; j++)
if (!end[son[i][j]]) InsertEdge(i,son[i][j]);
}
for (int i=; i<=sz; i++) if (!d[i] && !end[i]) q.push(i);
while (!q.empty())
{
int now=q.front(); q.pop(); sum++;
for (int i=head[now]; i; i=edge[i].next)
if (!--d[edge[i].to]) q.push(edge[i].to);
}
return sum==sz;
}
int main()
{
scanf("%d",&N);
for (int i=; i<=N; i++) scanf("%s",s+),Insert(s);
Getfail();
if (Topo()) puts("NIE"); else puts("TAK");
return ;
}

【BZOJ-2938】病毒 Trie图 + 拓扑排序的更多相关文章

  1. Bzoj 1565&colon; &lbrack;NOI2009&rsqb;植物大战僵尸 最大权闭合图&comma;拓扑排序

    题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:p ...

  2. HDU4857——逃生&lpar;反向建图&plus;拓扑排序&rpar;&lpar;BestCoder Round &num;1&rpar;

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  3. POJ3687——Labeling Balls&lpar;反向建图&plus;拓扑排序&rpar;

    Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...

  4. BZOJ&lowbar;1916&lowbar;&lbrack;Usaco2010 Open&rsqb;冲浪&lowbar;分层图&plus;拓扑排序&plus;DP

    BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP Description 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建 一个水上乐园. ...

  5. BZOJ&lowbar;4383&lowbar;&lbrack;POI2015&rsqb;Pustynia&lowbar;线段树优化建图&plus;拓扑排序

    BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...

  6. BZOJ 2938&colon; &lbrack;Poi2000&rsqb;病毒 &lbrack;AC自动机 拓扑排序&rsqb;

    2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...

  7. &lbrack;POI2015&rsqb;&lbrack;bzoj4383&rsqb; Pustynia &lbrack;线段树优化建图&plus;拓扑排序&rsqb;

    题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...

  8. &lbrack;USACO12DEC&rsqb;第一&excl;First&excl; &lpar;Trie树&comma;拓扑排序&rpar;

    题目链接 Solution 感觉比较巧的题啊... 考虑几点: 可以交换无数次字母表,即字母表可以为任意形态. 对于以其他字符串为前缀的字符串,我们可以直接舍去. 因为此时它所包含的前缀的字典序绝对比 ...

  9. 图——拓扑排序(uva10305)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

随机推荐

  1. Leetcode&colon; word search

    July 6, 2015 Problem statement: Word Search Given a 2D board and a word, find if the word exists in ...

  2. Java应用程序项目的打包与发行(run&period;bat形式)

    参考: http://www.iteye.com/topic/57312 背景: 以前一直都是在eclipse上面创建应用程序,每次要要运行的时候都要打开eclipse, 直到有个同事叫我帮忙写一个应 ...

  3. (六)6&period;10 Neurons Networks implements of softmax regression

    softmax可以看做只有输入和输出的Neurons Networks,如下图: 其参数数量为k*(n+1) ,但在本实现中没有加入截距项,所以参数为k*n的矩阵. 对损失函数J(θ)的形式有: 算法 ...

  4. 浅谈MapControl控件和PageLayoutControl控件

    1.MapControl控件是ArcObject(ArcEngine)中使用非常普遍的一个控件,它对应ArcMap中的DataView视图.MapControl控件实现的功能: 1)管理控件的外观.显 ...

  5. Android开发手记&lpar;30&rpar; 触摸及手势操作

    触摸操作在现在智能手机系统中起到举足轻重的作用,本文将对安卓中的触摸以及一些简单手势的操作进行简单的介绍. 1.触摸 首先是关于触摸的判断,有两种方法可以判断的触摸操作. (1)setOnTouchL ...

  6. gtest简短,简单易用

    gtest它是一种跨平台的(Liunx.Mac OS X.Windows.Cygwin.Windows CE and Symbian)的C++测试框架.有google该公司宣布. gtest台上为编写 ...

  7. SQL进阶随笔--case用法(二)

    ---恢复内容开始--- 用 CHECK 约束定义多个列的条件关系 今天来说下check和case的用法.其实,CASE 表达式和 CHECK 约束是很般配的一对组合.也许有很多数据库工程师不怎么用 ...

  8. POJ 3186 Treats for the Cows &lpar;动态规划)

    Description FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for gi ...

  9. django&period;core&period;exceptions&period;AppRegistryNotReady&colon; Apps aren&&num;39&semi;t loaded yet&period;

    报错现象 django 启动的时候报错 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. 报错解决 记不清是我有毛 ...

  10. poj2441状态压缩dp基础

    /* 给定n头牛,m个谷仓,每头牛只能在一些特定的谷仓,一个谷仓只能有一头牛 问可行的安排方式 dp[i][j]表示前i头牛组成状态j的方案数,状态0表示无牛,1表示有牛 使用滚动数组即可 枚举到第i ...