博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2938 & 洛谷2444:[POI2000]病毒——题解
阅读量:6586 次
发布时间:2019-06-24

本文共 1438 字,大约阅读时间需要 4 分钟。

二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。

对于多串,先建立AC自动机。

然后考虑对于没有病毒代码的代码来说,它会在AC自动机上一直走直到跳出。

而如果走出了一个环的话就意味着它可以沿着这个环无限延伸——这就是我们所要求的。

所以我们建立AC自动机跑dfs搜环(当然危险节点不能走),如果有环就是TAK,否则就是NIE。

#include
#include
#include
#include
#include
#include
#include
using namespace std;const int N=2010;const int M=30010;struct trie{ bool ed; int a[2],fail;}tr[M*20];int cnt=0;char s[M];inline void insert(){ int now=0; int len=strlen(s); for(int i=0;i
q; tr[0].fail=0; for(int i=0;i<2;i++){ if(tr[0].a[i]){ tr[tr[0].a[i]].fail=0; q.push(tr[0].a[i]); } } while(!q.empty()){ int u=q.front(); q.pop(); for(int i=0;i<2;i++){ if(tr[u].a[i]){ int v=tr[u].a[i]; tr[v].fail=tr[tr[u].fail].a[i]; tr[v].ed|=tr[tr[v].fail].ed; q.push(tr[u].a[i]); }else{ tr[u].a[i]=tr[tr[u].fail].a[i]; } } } return;}bool vis[M*20],met[M*20];bool dfs(int u){ vis[u]=1; for(int i=0;i<2;i++){ int v=tr[u].a[i]; if(vis[v])return 1; if(tr[v].ed||met[v])continue; met[v]=1; if(dfs(v))return 1; } vis[u]=0; return 0;}int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>s; insert(); } getfail(); if(dfs(0))puts("TAK"); else puts("NIE"); return 0;}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +欢迎访问我的博客:+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8539086.html

你可能感兴趣的文章
给大家推荐一个免费下载名称读写ntfs软件的地方
查看>>
突然停电或死机导致没保存的文件怎么找回
查看>>
kudu
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
maven 添加阿里云maven镜像
查看>>
对向量、矩阵求导
查看>>
各版本linux下载地址大全
查看>>
CentOS 6.X 关闭不需要的 TTY 方法
查看>>
编程能力的四种境界
查看>>
在windows上秒开应用程序
查看>>
【20180611】MySQL OOM
查看>>
mysql主从复制实现数据库同步
查看>>
面试-1
查看>>
【框架学习】ibatis DAO框架分析
查看>>
ZOJ 3640 Help Me Escape
查看>>
C#下实现的半角转与全角的互转
查看>>
PreparedStatement vs Statement
查看>>
删除windows中的库、家庭组、收藏夹
查看>>
war 宽度变窄
查看>>
set p4 environment in windows
查看>>