bzoj2938 [Poi2000]病毒 ac自动机
2018-02-07 21:41
453 查看
Description
二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。示例:
例如如果{011, 11, 00000}为病毒代码段,那么一个可能的无限长安全代码就是010101…。如果{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。
任务:
请写一个程序:
l 读入病毒代码;
l 判断是否存在一个无限长的安全代码;
l 将结果输出
Solution
无限长又不包含那就是在trie上走不到匹配点且有了一个环,那么直接建trie后dfs判环,这里为了方便把x的fail压到x的儿子节点处Code
#include <stdio.h> #include <string.h> #include <queue> #define rep(i,st,ed) for (int i=st;i<=ed;++i) const int N=200005; int count ,rec [2],fail ,cnt=0; char str ; std:: queue <int> que; bool vis ,ins ; void get_fail() { rep(i,0,1) { if (rec[0][i]) { que.push(rec[0][i]); } } while (!que.empty()) { int now=que.front(); que.pop(); rep(i,0,1) { if (!rec[now][i]) { rec[now][i]=rec[fail[now]][i]; continue; } que.push(rec[now][i]); int tmp=fail[now]; while (tmp&&!rec[tmp][i]) tmp=fail[tmp]; fail[rec[now][i]]=rec[tmp][i]; count[rec[now][i]]|=count[rec[tmp][i]]; } } } void insert(char *str) { int len=strlen(str); int now=0; rep(i,0,len-1) { if (!rec[now][str[i]-'0']) { rec[now][str[i]-'0']=++cnt; } now=rec[now][str[i]-'0']; } count[now]=1; } bool dfs(int now) { vis[now]=ins[now]=1; rep(i,0,1) { if (!rec[now][i]) continue; if (ins[rec[now][i]]) return true; if (vis[rec[now][i]]||count[rec[now][i]]) continue; if (dfs(rec[now][i])) return true; } ins[now]=0; return false; } int main(void) { int n; scanf("%d",&n); rep(i,1,n) { scanf("%s",str); insert(str); } get_fail(); if (dfs(0)) puts("TAK"); else puts("NIE"); return 0; }
相关文章推荐
- 【bzoj2938】[Poi2000]病毒 AC自动机
- [bzoj2938][Poi2000]病毒 AC自动机
- BZOJ_2938_[Poi2000]病毒_AC自动机
- 【bzoj2938】[Poi2000]病毒 AC自动机
- [bzoj2938][Poi2000]病毒_AC自动机
- BZOJ 2938 [Poi2000]病毒(AC自动机)
- AC自动机【poi2000】bzoj2938 病毒
- BZOJ2938 POI2000 病毒 补全AC自动机 Trie图判环
- bzoj 2938 [Poi2000]病毒
- [BZOJ2938][POI2000]病毒 做题笔记
- 【BZOJ2938】病毒(POI2000)-AC自动机+DFS判环
- 【BZOJ2938】病毒,AC自动机练习
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
- BZOJ 2938: [Poi2000]病毒 AC自动机
- BZOJ 2938 [Poi2000]病毒
- [bzoj2938] [Poi2000]病毒
- [BZOJ 2938][Poi2000]病毒
- 【BZOJ】【2938】【POI2000】病毒
- [BZOJ2938][Poi2000]病毒(AC自动机+拓扑排序)
- BZOJ 2938: [Poi2000]病毒 AC自动机