当前位置: 首页 > news >正文

BZOJ2938:[POI2000]病毒(AC自动机)

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

Solution

QvQ现在才理解AC自动机buildfail的时候继承儿子其实就相当于把trie树补成trie图
对于这个题只需要建好trie图,然后在trie图上找一个环
为什么呢?因为我们如果拿一个安全代码在自动机上跑
一定会不停的跑而到不了单词的结束点,这就要求必须有个环
而且这个环要求必须经过根节点,且不经过一些限制节点
限制节点包括单词的结束节点,还有若一个点的fail指向的点是限制节点
那么这个点也是限制节点。
因为fail指向的是当前串的最长后缀,
fail指向的后缀都是病毒了,那当前串本身一定也是病毒了

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 #define N (100000+100)
 6 using namespace std;
 7 int Son[N][27],Fail[N],End[N],Ind[N];
 8 int n,sz,head[N],num_edge;
 9 bool vis[N],flag;
10 char s[N];
11 queue<int>q;
12 
13 void Insert(char s[])
14 {
15     int now=0,len=strlen(s);
16     for (int i=0; i<len; ++i)
17     {
18         int x=s[i]-'0';
19         if (!Son[now][x]) Son[now][x]=++sz;
20         now=Son[now][x];
21     }
22     ++End[now];
23 }
24 
25 void Build_Fail()
26 {
27     for (int i=0; i<=1; ++i)
28         if (Son[0][i])
29             q.push(Son[0][i]);
30     while (!q.empty())
31     {
32         int now=q.front();
33         q.pop();
34         for (int i=0; i<=1; ++i)
35         {
36             if (!Son[now][i])
37             {
38                 Son[now][i]=Son[Fail[now]][i];
39                 continue;
40             }
41             Fail[Son[now][i]]=Son[Fail[now]][i];
42             if (End[Fail[Son[now][i]]]) End[Son[now][i]]++;
43             //因为fail指针指向的点代表的字符串一定是当前字符串的一个最长后缀
44             //若后缀都是病毒了,那他本身一定也是病毒了
45             q.push(Son[now][i]);
46         }
47     }
48 }
49 
50 int ins[N],used[N];
51 bool Dfs(int x)
52 {
53     ins[x]=1;
54     for(int i=0; i<2; i++)
55     {
56         int v=Son[x][i];
57         if(ins[v])return 1;
58         if(used[v]||End[v])continue;
59         used[v]=1;
60         if(Dfs(v))return 1;
61     }
62     ins[x]=0;
63     return 0;
64 }
65 
66 int main()
67 {
68     scanf("%d",&n);
69     for (int i=1; i<=n; ++i)
70         scanf("%s",s),Insert(s);
71     Build_Fail();
72     if(Dfs(0))puts("TAK");
73     else puts("NIE");
74 }

转载于:https://www.cnblogs.com/refun/p/8685602.html

相关文章:

  • MaxCompute访问TableStore(OTS) 数据
  • 并发之痛 Thread,Goroutine,Actor
  • qca wlan wifi modules解析二
  • 结合 Laravel 初步学习 GraphQL
  • 实验三 类与对象(zxt)
  • 翻译:DECLARE HANDLER语句(已提交到MariaDB官方手册)
  • 窥探Node.js里的Stream
  • 给mybatis添加自动建表,自动加字段的功能
  • 如何夯实(Java)编程基础,并深入学习和提高
  • 大话测试与质量
  • 文顶顶虽老,博客尚在
  • BZOJ3998:[TJOI2015]弦论——题解
  • 3、第一个Appium测试
  • 【代码片段】Python发送带图片的邮件
  • @Autowired @Resource @Qualifier的区别
  • AngularJS指令开发(1)——参数详解
  • CSS盒模型深入
  • ES学习笔记(12)--Symbol
  • mysql中InnoDB引擎中页的概念
  • Python打包系统简单入门
  • React16时代,该用什么姿势写 React ?
  • Vim 折腾记
  • VuePress 静态网站生成
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 力扣(LeetCode)965
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 一文看透浏览器架构
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • $refs 、$nextTic、动态组件、name的使用
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Oracle)SQL优化技巧(一):分页查询
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)springcloud实战之config配置中心
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (五)MySQL的备份及恢复
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)可以带来幸福的一本书
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net对接阿里云CSB服务
  • .net和jar包windows服务部署
  • .Net中间语言BeforeFieldInit
  • /bin/bash^M: bad interpreter: No such file or directory
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • []我的函数库
  • [20140403]查询是否产生日志
  • [20170728]oracle保留字.txt
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法