bzoj2938,tyvj4338,病毒(trie+拓扑判环)
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
问能否找出一个无限的不出现的给出序列的序列。
其实就是是否可以在Trie安全图内无限走,就是是否有环。
基本思路就是把Trie安全图提出来,拓扑判断是否有环(判环的问题需要整理一下)
实现好乱。呜呜呜
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;int n,tot=1,ch[100005][2],val[100005],fail[100005];//Trie
int num,in[100005],head[100005],cnt,pre[100005],to[100005],V;//safe graph
char s[30005];
bool b[100005];
inline int idx(char ch){return ch-'0';}
void addedge(int x,int y)
{in[y]++;to[++cnt]=y;pre[cnt]=head[x];head[x]=cnt;
}
void insert(char *s)
{int k=1,len=strlen(s);for (int i=0;i<len;i++){int id=idx(s[i]);if (ch[k][id]==0) ch[k][id]=++tot;k=ch[k][id];}val[k]=1;
}
void getfail()
{queue<int> q;q.push(1);while (!q.empty()){int x=q.front(),y,j;q.pop();val[x]|=val[fail[x]];for (int i=0;i<=1;i++){j=fail[x];while (j&&!ch[j][i]) j=fail[j];if (ch[x][i]){fail[y=ch[x][i]]=j?ch[j][i]:1;q.push(y);}else ch[x][i]= (j?ch[j][i]:1);}}
}
bool circle()
{queue<int> q;int sum=0;for (int i=1;i<=tot;i++){if (val[i]) sum++;else for (int j=0;j<=1;j++) if (!val[ch[i][j]])addedge(i,ch[i][j]);}for (int i=1;i<=tot;i++) if (!val[i]&&!in[i]) q.push(i);while (!q.empty()){int x=q.front();q.pop();sum++;for(int i=head[x];i;i=pre[i]){int y=to[i];in[y]--;if (!in[y]) q.push(y);}}return sum==tot;
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%s",s);insert(s);}getfail();if (circle()) printf("NIE");else printf("TAK");return 0;
}
bzoj2938,tyvj4338,病毒(trie+拓扑判环)相关推荐
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 609 Solved: 318 [Submit][Status][ ...
- BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2140 是 hydro 的 BZOJ ...
- Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环
传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...
- Codeforces Round #467 (Div. 1): B. Sleepy Game(BFS+有向图判环)
题意(经过转换):给你一个n个点m条边的有向图,再给你一个起点x,问存不存在一条路径满足①路径中有奇数条边:②终点的出度为0,如果存在输出Win,并在第二行输出这个路径(可能不唯一输出任意一种),否则 ...
- topo排序判环实操
项目场景: 有一张订单表,和订单关系表,订单关系表中维护订单与订单之间的父子关系(多对多). 现在需要根据目标订单id去查询到目标订单关系的完整链路与链路中订单信息集合,并且判断链路是否有成环现象. ...
- P1444 [USACO1.3]虫洞 wormhole,新手向超详细讲解(搜索、判环、拆点、好题)
题目传送门 题目不难,但是有很多细节和技巧. 分析题意 首先我们根据题意发现奶牛一共只会出现两种动作(两种情况),一是向右走,二是传送. 我们并不知道奶牛的位置,而题目所求的是有多少种分配虫洞传送的分 ...
- 1352. 虫洞【难度: 中 / 枚举 判环】
https://www.acwing.com/problem/content/1354/ 枚举匹配方法 判环 #include<bits/stdc++.h> using namespace ...
- CodeForces - 1335F Robots on a Grid(拓扑找环+反向dfs/倍增)
题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,矩阵的每一个格子都有一个颜色,颜色非黑即白,除此之外每个格子还有一个指令,分别为: ' U ':向上一个单位 ' D ':向下一个单位 ' ...
- floyd判环算法(龟兔赛跑算法)
floyd判环算法(龟兔赛跑算法) 注意,这个算法是用来判断一条链+一条环的图,环的长度或者环与链的交界处的,所以此floyd非彼floyd(虽然都是一个人想出来的). (图不是我的) 如果只要求环的 ...
最新文章
- 关于Inflater
- MATLAB实战系列(八)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)(附MATLAB代码)
- Windows下 更改 pip默认缓存目录
- matlab画图模糊,[转载]matlab中模糊工具箱的使用
- leetcode 167 Two Sum II - Input array is sorted
- 黄开宁:搞多媒体开发要掌握好信号处理、统计和数理分析
- 网易视频云:分布式转码服务高可用浅析
- python的read_csv_python,pd.read_csv成熟导入
- Ubuntu-16-04-编译-Caffe-SSD
- jQuery - 通过文本描述设置选择控件的选定值
- css3常用技巧_您可能错过的5个CSS3技巧和窍门
- is内存地址 id 地址比较 小数据池概念
- 最强人工智能 OpenAI 极简教程
- 为啥点击种子迅雷显示forum.php,迅雷无法解析种子怎么回事_迅雷种子无法解析解决教程...
- nyoj366 D的小L 全排列模板题
- 【有根树】Rooted Trees C++
- 两种三角形的打印方法
- 中国高端制造进展神速,又一项新科技产品即将取得全球第一!
- 云效安全那些事儿-Codeup代码智能安全检测服务
- Wormhole大数据流式处理平台五大功能