[洛谷P2444] [POI2000]病毒
洛谷题目链接:[POI2000]病毒
题目描述
二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。
示例:
例如如果{011, 11, 00000}为病毒代码段,那么一个可能的无限长安全代码就是010101…。如果{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。
任务:
请写一个程序:
1.在文本文件WIR.IN中读入病毒代码;
2.判断是否存在一个无限长的安全代码;
3.将结果输出到文件WIR.OUT中。
输入输出格式
输入格式:
在文本文件WIR.IN的第一行包括一个整数n(n≤2000)(n\le 2000)(n≤2000),表示病毒代码段的数目。以下的n行每一行都包括一个非空的01字符串——就是一个病毒代码段。所有病毒代码段的总长度不超过30000。
输出格式:
在文本文件WIR.OUT的第一行输出一个单词:
TAK——假如存在这样的代码;
NIE——如果不存在。
输入输出样例
输入样例#1:
3
01
11
00000
输出样例#1:
NIE
题解: 显然我们是无法枚举一个无限长的串的,那么我们需要考虑找到这个构造方法.
既然是多模式串匹配,这里我们考虑使用\(AC\)自动机.
首先还是先建出\(AC\)自动机,然后我们考虑如何才能找到一个不被匹配的方法.我们知道如果匹配就是在\(AC\)自动机中访问到一个标记过的节点,或是该串的前缀中含有单词,所以我们可以在建树的过程中将有单词的点都打上标记,并且将它的所有子节点都打上标记,表示访问到这些节点就不存在合法答案.
那么如何找合法答案呢?因为在\(AC\)自动机上的匹配过程需要通过\(fail\)指针来跳转,所以如果能找到一个包含\(0\)节点(\(trie\)起始的空节点)的环,那么就可以一直在这个环上跳转一直不匹配成功,直接用\(dfs\)来找这个环就可以了.
#include<bits/stdc++.h>
using namespace std;
const int N = 3e4+5;
int n, cntn, ch[2][N], fail[N], chk[N], vis[N];
bool ok[N];
char s[N];
void insert(char *s){
int len = strlen(s+1), now = 0;
for(int i = 1; i <= len; i++){
if(!ch[s[i]-'0'][now]) ch[s[i]-'0'][now] = ++cntn;
now = ch[s[i]-'0'][now];
}
ok[now] = 0;
}
void build(){
queue <int> q;
if(ch[0][0]) q.push(ch[0][0]);
if(ch[1][0]) q.push(ch[1][0]);
while(!q.empty()){
int x = q.front(); q.pop();
for(int i = 0; i < 2; i++){
if(ch[i][x]){
fail[ch[i][x]] = ch[i][fail[x]];
q.push(ch[i][x]);
ok[ch[i][x]] &= ok[ch[i][fail[x]]];
}
else ch[i][x] = ch[i][fail[x]];
}
}
}
void dfs(int x){
if(vis[x]) cout << "TAK" << endl, exit(0);
if(chk[x] || !ok[x]) return;
vis[x] = chk[x] = 1;
dfs(ch[0][x]), dfs(ch[1][x]);
vis[x] = 0;
}
int main(){
cin >> n;
memset(ok, 1, sizeof(ok));
for(int i = 1; i <= n; i++) cin >> s+1, insert(s);
build();
dfs(0);
cout << "NIE" << endl;
return 0;
}
[洛谷P2444] [POI2000]病毒的更多相关文章
- 洛谷 P2444 [POI2000]病毒 解题报告
P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...
- 洛谷P2444 [POI2000]病毒(AC自动机,DFS求环)
洛谷题目传送门 AC自动机入门--yyb巨佬的博客 AC自动机入手经典好题(虽然年代久远) 有了fail指针,trie树就不是原来的树型结构了,我们可以把它叫做trie图,由父节点向子节点连的边和fa ...
- P2444 [POI2000]病毒
P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...
- P2444 [POI2000]病毒 AC自动机
P2444 [POI2000]病毒 #include <bits/stdc++.h> using namespace std; ; struct Aho_Corasock_Automato ...
- 【洛谷 P2444】 [POI2000]病毒(AC自动机)
题目链接 这么多字符串,肯定是自动机啦. 先建出AC自动机,然后怎么表示一个安全代码没有病毒代码呢? 就是存在一条路径不经过有病毒代码段结尾的节点呗. 所以呢?有环啊!dfs一下救星了. #inclu ...
- 【洛谷】P2444 [POI2000]病毒——AC自动机
题目链接 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段, ...
- 洛谷P2444 病毒 [POI2000] AC自动机
正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...
- 洛谷 - P2444 - 病毒 - AC自动机
https://www.luogu.org/problemnew/show/P2444 有点恶心,不太明白fail的意义. #include<bits/stdc++.h> using na ...
- 洛谷P2444 病毒【AC自动机】
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
随机推荐
- windows下的C++ socket服务器(2)
int main(int ac, char *av[]) { ); ) { exit(); } thread t; ) { int socket_fd = accept(tcp_socket, nul ...
- koa中接收前台传递的各种数据类型的方式
标签(空格分隔): koa 数据类型接收 主要介绍三种会用到的中间件,其实都是自己在开发的过程中踩过的坑 首先介绍koa-body [详情介绍 https://github.com/dlau/koa- ...
- GDI+缩放图片
uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var Bitmap1: TGPBitmap; Bitmap2: TBitmap; Graphic: TGPGraphi ...
- Mac配置环境变量
Mac配置环境变量,以ant和maven为例 1.编辑 .bash_profile文件 cd vi .bash_profile 编辑内容为 ------------------------- ...
- Python Matplotlib绘图库 安装
一般我们在做科学计算的时候,首先会想到的是matlab,但是呢,一想到matlab安装包那么大,我就有点不想说什么了. Matplotlib 是python最著名的绘图库,它提供了一整套和matlab ...
- mysql索引的优化
MySQL索引的优化 上面都在说使用索引的好处,但过多的使用索引将会造成滥用.因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT.UPDATE和DEL ...
- 配置SSH Forward提升安全性
目标 MacBook ---(SSH)---> BastionServer ---(SSH)---> RemoteServer 说明 BastionServer.RemoteServe ...
- BZOJ3244 NOI2013树的计数(概率期望)
容易发现的一点是如果确定了每一层有哪些点,树的形态就确定了.问题变为划分bfs序. 考虑怎样划分是合法的.同一层的点在bfs序中出现顺序与dfs序中相同.对于dfs序中相邻两点依次设为x和y,y至多在 ...
- CIR,CBS,EBS,PIR,PBS傻傻分不清楚?看这里!—-揭秘令牌桶
概述 春暖花开的时候,大家都开着汽车外出旅游欣赏美丽的风景,却被堵在高速公路上,你是否为此感到痛苦?但如果有一种机制可以评估高速公路上的车流量.控制车流情况,确保进入高速公路的汽车都能在路上安全畅行, ...
- tomcat启动后过一会就自动关闭
1.打开tomcat 下的log查看关键字眼 常见问题就是端口被占用,被idea 页面启动占用了