洛古2444 [POI2000]病毒 ac自动机
2018-03-05 20:10
253 查看
题目大意
二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。示例:
例如如果{011, 11, 00000}为病毒代码段,那么一个可能的无限长安全代码就是010101…。如果{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。
任务:
请写一个程序:
1.在文本文件WIR.IN中读入病毒代码;
2.判断是否存在一个无限长的安全代码;
3.将结果输出到文件WIR.OUT中。
分析
既然这个自动机又像一个图,那我们的问题不就变成了——在AC自动机(trie图)中寻找一个环,并且环上没有任何危险节点,并且还要注意,这个环能被根节点访问到(也就是说从根节点出发能在不经过危险节点的情况下走到到这个环code
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std; #define MAX 50000 struct Node { int vis[2]; int fail,lt; }t[MAX]; int n,tot; char ch[MAX]; void insert(char *s) { int l=strlen(s+1),now=0; for(int i=1;i<=l;++i) { if(!t[now].vis[s[i]-48]) t[now].vis[s[i]-48]=++tot; now=t[now].vis[s[i]-48]; } t[now].lt=1; } void Getfail() { queue<int> Q; for(int i=0;i<2;++i) if(t[0].vis[i])Q.push(t[0].vis[i]); while(!Q.empty()) { int u=Q.front();Q.pop(); t[u].lt|=t[t[u].fail].lt; for(int i=0;i<2;++i) if(t[u].vis[i]) t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]); else t[u].vis[i]=t[t[u].fail].vis[i]; } } bool vis[MAX]; bool vv[MAX]; void DFS(int u) { if(t[u].lt)return; if(vis[u]){puts("TAK");exit(0);} if(vv[u])return; vis[u]=true;vv[u]=true; for(int i=0;i<2;++i) if(t[u].vis[i]) DFS(t[u].vis[i]); vis[u]=false; } int main() { scanf("%d",&n); while(n--) { scanf("%s",ch+1); insert(ch); } Getfail(); DFS(0); puts("NIE"); return 0; }
相关文章推荐
- [bzoj2938][Poi2000]病毒 AC自动机
- 【bzoj2938】[Poi2000]病毒 AC自动机
- [bzoj2938][Poi2000]病毒_AC自动机
- AC自动机【poi2000】bzoj2938 病毒
- 【bzoj2938】[Poi2000]病毒 AC自动机
- [Luogu2444][POI2000]病毒
- BZOJ2938 [Poi2000]病毒 【AC自动机】
- BZOJ_2938_[Poi2000]病毒_AC自动机
- [luoguP2444] [POI2000]病毒(AC自动机 + dfs)
- bzoj2938 [Poi2000]病毒 ac自动机
- BZOJ2938 POI2000 病毒 补全AC自动机 Trie图判环
- BZOJ2938[Poi2000]病毒 AC自动机
- BZOJ2938 [Poi2000]病毒 解题报告【AC自动机】【DFS】
- BZOJ 2938 [Poi2000]病毒(AC自动机)
- [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]
- 【bzoj2938】[Poi2000]病毒
- 【bzoj 2938】病毒(AC自动机)
- AC自动机 hdu2896 hdu3065 病毒侵袭
- [BZOJ2938][POI2000]病毒(AC自动机+dfs)
- bzoj 2938: [Poi2000]病毒 AC自动机