【bzoj2938】[Poi2000]病毒 AC自动机
题目描述
输入
输出
样例输入
3
01
11
00000
样例输出
NIE
题解
AC自动机
如果一个串能无限长,那么说明它可以一直匹配,而始终不匹配病毒串。
每次查找到下一个字符时,只有两种可能:
(1)存在子节点,进入该子节点。
(2)不存在子节点,进入fail节点,直至存在子节点。
那么是否能无限匹配,就转化为有没有相应的环。
这里为了方便,将fail合并到子节点。
除了排除病毒串节点以外,还应排除fail指向病毒串的节点,因为该串后缀为病毒串前缀。
然后dfs判环即可。
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
queue<int> q;
int nt[30001][2] , fail[30001] , cnt[30001] , tot = 1;
char str[30001];
bool vis[30001] , ins[30001] , flag;
int deep[30001] , low[30001] , sta[30001] , ind , h;
void build()
{
int u , t , i;
q.push(1);
nt[0][0] = nt[0][1] = 1;
while(!q.empty())
{
u = q.front();
q.pop();
for(i = 0 ; i < 2 ; i ++ )
{
if(nt[u][i])
{
q.push(nt[u][i]);
t = fail[u];
while(t && !nt[t][i])
t = fail[t];
fail[nt[u][i]] = nt[t][i];
cnt[nt[u][i]] |= cnt[nt[t][i]];
}
else
nt[u][i] = nt[fail[u]][i];
}
}
}
bool dfs(int x)
{
ins[x] = vis[x] = 1;
int i , y;
for(i = 0 ; i < 2 ; i ++ )
{
y = nt[x][i];
if(ins[y] || (!vis[y] && !cnt[y] && dfs(y)))
return 1;
}
ins[x] = 0;
return 0;
}
int main()
{
int n , i , t , l;
scanf("%d" , &n);
while(n -- )
{
scanf("%s" , str);
l = strlen(str);
t = 1;
for(i = 0 ; i < l ; i ++ )
{
if(!nt[t][str[i] - '0'])
nt[t][str[i] - '0'] = ++tot;
t = nt[t][str[i] - '0'];
}
cnt[t] = 1;
}
build();
printf("%s\n" , dfs(1) ? "TAK" : "NIE");
return 0;
}
【bzoj2938】[Poi2000]病毒 AC自动机的更多相关文章
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ2938:[POI2000]病毒(AC自动机)
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- [bzoj2938][Poi2000]病毒_AC自动机
病毒 bzoj-2938 Poi-2000 题目大意:给你n个01串,问是否存在一个无限长的01串使得这个01的任意子串都不等于给出的01串. 注释:All_length<=30,000 想法: ...
- [POI2000]病毒 --- AC自动机
[POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...
- BZOJ [Poi2000]病毒 AC自动机_DFS_细节
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- 【洛谷】P2444 [POI2000]病毒——AC自动机
题目链接 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段, ...
- P2444 [POI2000]病毒 AC自动机
P2444 [POI2000]病毒 #include <bits/stdc++.h> using namespace std; ; struct Aho_Corasock_Automato ...
随机推荐
- Hibernate怎么用
一.为什么用Hibernate? [核心:对象关系映射] Hibernate是对jdbc的轻量级封装,可以简化数据库连接操作, 在该框架之前,数据库的操作步骤是: 1.根据连接字串获取连接 2.执行s ...
- BZOJ2761_不重复数字_KEY
题目传送门 Map水过(或set也行). code: /************************************************************** Problem: ...
- Uber优步北京第一组奖励政策
优步北京第一组: 定义为2015年6月1日凌晨前(不含6月1日)激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机 ...
- ORB代码框架梳理
这里从单目入手,画了一个框架图:
- Error starting mongod. /var/run/mongodb/mongod.pid exists.启动mongodb报错
linux上安装mongodb,启动时报上面的错,解决如下: 解决方法: 1.删除mongod.pid文件 rm -rf /var/run/mongodb/mongod.pid 2.修改/tmp/mo ...
- android 学习六 构建用户界面和使用控件
1.常用Android控件最终都会继承自View类 2.ViewGroup是一些布局类列表的基类,包括View和ViewGroup 3.构造界面的三种方法 a.完全使用代码(太灵活,而不好维护) ...
- 2019年猪年海报PSD模板-第五部分
14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1CuZKPmFbbSBvzSXoCt2few
- 「知识学习&日常训练」莫队算法(一)(Codeforce Round #340 Div.2 E)
题意 (CodeForces 617E) 已知一个长度为\(n\)的整数数列\(a[1],a[2],-,a[n]\),给定查询参数\(l,r\),问\([l,r]\)内,有多少连续子段满足异或和等于\ ...
- Python 发邮件例子
Python 发邮件例子 例子 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-04-23 16:12:33 # @Autho ...
- 第三模块:面向对象&网络编程基础 第3章 选课系统作业讲解
01-选课系统作业讲解1 02--选课系统作业讲解2 03-选课系统作业讲解3 04--选课系统作业讲解4 01-选课系统作业讲解1 02--选课系统作业讲解2 03-选课系统作业讲解3 04--选课 ...