博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ2938][POI2000]病毒(AC自动机)
阅读量:7047 次
发布时间:2019-06-28

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

Description

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

示例: 例如如果{011, 11, 00000}为病毒代码段,那么一个可能的无限长安全代码就是010101…。如果{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。 任务: 请写一个程序: (1) 读入病毒代码;

(2) 判断是否存在一个无限长的安全代码;

(3) 将结果输出

Input Format

第一行包括一个整数n,表示病毒代码段的数目。以下的n行每一行都包括一个非空的01字符串——就是一个病毒代码段。所有病毒代码段的总长度不超过30000。

Output Format

你应在在文本文件WIN.OUT的第一行输出一个单词: (1) TAK——假如存在这样的代码; (2) NIE——如果不存在。

Solution

建AC自动机,将fail指针合并到子节点上,然后形成一个有向图,

然后在图上dfs,如果有环就是有无限长的串

Code

 

#include 
#include
#include
#define N 30010using namespace std;char s[N];int n,T[N][2],fail[N],cnt=1,q[N];bool mark[N],vis[N],inq[N];inline void Insert(){ scanf("%s\n",s); int len=strlen(s),now=1; for(int i=0;i

 

 

 

 

转载于:https://www.cnblogs.com/void-f/p/9016508.html

你可能感兴趣的文章
centOS Python 安装2.7以上版本
查看>>
最近気になる清掃
查看>>
C语言下的简易计算器
查看>>
git 分支
查看>>
一类分治问题
查看>>
[ZJOI2017]树状数组
查看>>
Android SDK无法更新问题解决
查看>>
LeetCode – Refresh – N-Queens II
查看>>
LeetCode 639: DecodeWaysII
查看>>
Linux系统简介--LInix系统随笔(一)
查看>>
TCP接入层的负载均衡、高可用、扩展性架构
查看>>
使用Kieker(AspectJ)监控控制台程序
查看>>
C#多线程之旅(1)——介绍和基本概念
查看>>
Spring常用注解汇总
查看>>
10大最重要的Web安全风险之六--A6-安全误配置
查看>>
Hibernate【与Spring整合】
查看>>
NOIP2018 游记
查看>>
Redis 和 Memcached 的区别
查看>>
关于tcp状态及一些延展
查看>>
JS入门
查看>>