【bzoj2938】[Poi2000]病毒 trie图+dfs
2016-02-25 08:31
302 查看
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
听说trie图就是AC自动机改一下?题意可以理解成 找一个无限长的串使它可以在trie图上无限走,让它永远失配。
那么单词结尾节点就不能走,指向它的fail指针的那个点也不能走,所以干脆就合并起来,这就有trie图了。
这样就形成了一个有向图,现在要从根节点出发找一个环,使得路径上不经过单词结尾节点…dfs即可
原来dfs找环可以加个数组记忆化一下啊…就是判重
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int SZ = 1000010; int ch[SZ][3],sz = 0,val[SZ]; void insert(char s[]) { int p = 0; int l = strlen(s); for(int i = 0;i < l;i ++) { int c = s[i] - '0'; if(!ch[p][c]) ch[p][c] = ++ sz; p = ch[p][c]; } val[p] ++; } int fail[SZ]; queue<int> q; void build_ac() { fail[0] = 0; for(int i = 0;i < 2;i ++) { int u = ch[0][i]; if(u) { q.push(u); fail[u] = 0; } } while(q.size()) { int f = q.front(); q.pop(); for(int i = 0;i < 2;i ++) { int u = ch[f][i]; if(!u) { ch[f][i] = ch[fail[f]][i]; continue; } q.push(u); int v = fail[f]; while(v && !ch[v][i]) v = fail[v]; fail[u] = ch[v][i]; val[u] |= val[fail[u]]; } } } bool ins[SZ],vis[SZ]; bool dfs(int u) { ins[u] = 1; for(int i = 0;i < 2;i ++) { int v = ch[u][i]; if(ins[v]) return true; if(val[v] || vis[v]) continue; vis[v] = 1; if(dfs(v)) return true; } ins[u] = 0; return false; } char s[SZ]; int main() { int n; scanf("%d",&n); for(int i = 1;i <= n;i ++) { scanf("%s",s); insert(s); } build_ac(); if(dfs(0)) puts("TAK"); else puts("NIE"); return 0; } /* 3 011 11 00000 */
相关文章推荐
- 【BZOJ 3504】[Cqoi2014]危桥
- 极路由下打不开soundcloud怎么办?
- 如何取消:win7拖动桌面快捷方式到回收站,提示:这些文件可能对你的计算机有害
- kobox: key_proc.c -v1 怎样使用proc文件系统调试驱动
- java练习题,比较两数大小
- Linux服务启动报:Address already in use 解决方法:预留端口避免占用ip_local_reserved_ports
- 轻松实现本地存储(LocalStorage)-store.js
- 坐标系的转换
- HD7 使用点滴
- 语法分析器(java)
- [Regionals 2012 :: Asia - Tokyo ]
- Phone 7编程点滴
- C#连接MySQL数据库的几点注意
- 【BZOJ 1090】[SCOI2003]字符串折叠
- TypeScript Interface(接口)
- NS2下实现一个无线网络广播包的大致流程
- 黑马程序员-----------浅谈多线程
- JSP自定义标签继承哪个类
- lintcode-easy-Identical Binary Tree
- Cygwin 安装