BZOJ.2938.[POI2000]病毒(AC自动机)
\(Description\)
给n个模式串,问是否存在长度无限的主串,使得任何一个模式串都没有在主串中出现。
\(Solution\)
先建AC自动机。
假设我们有了一个无限长的安全代码,然后在AC自动机上匹配应该发生什么?
应该是匹配到一个位置失败跳回去,之后要再匹配到这个位置(必须跳回当前链)再失败跳回去。跳回去就是通过fail指针。
Trie树上连上fail指针的边后(其实就是Build时改的son),如果能在这个有向图上找到环,就TAK。
或者,安全代码无限长的话前后要能拼起来,即前后缀相同(同样要跳回当前链),且保证在这过程中不会匹配任何模式串。
前后缀相同就是通过fail指针跳回去(到当前链)。
建图(就是建AC自动机),DFS一遍就可以。注意如果fail[x]匹配,那么x也匹配。
注意访问过的点就没必要再访问了。
这题感觉理解不能,感觉AC自动机在从头开始学。。
//1408kb 72ms
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
const int N=30005;
struct AC_Automaton
{
int tot,son[N][2],q[N],fail[N];
bool ed[N],vis[N],ins[N];
char s[N];
void Insert()
{
scanf("%s",s);
int l=strlen(s),x=0;
for(int i=0,v; i<l; ++i)
{
if(!son[x][v=s[i]-'0']) son[x][v]=++tot;
x=son[x][v];
}
ed[x]=1;
}
void Build()
{
int h=0,t=0;
if(son[0][0]) q[t++]=son[0][0];
if(son[0][1]) q[t++]=son[0][1];
while(h<t)
{
int x=q[h++];
ed[x]|=ed[fail[x]];//WA:fail[x]一定比x更早结束路径 fail[x]和x又不一定在同一条路径→_→
for(int i=0; i<2; ++i)
if(son[x][i]) fail[son[x][i]]=son[fail[x]][i], q[t++]=son[x][i];
else son[x][i]=son[fail[x]][i];
}
}
void DFS(int x)
{
if(ins[x]) puts("TAK"),exit(0);//如果是在当前链上,那也没有终止节点
if(vis[x]||ed[x]) return;
vis[x]=ins[x]=1;
DFS(son[x][0]), DFS(son[x][1]);
ins[x]=0;
}
void Query()
{
Build(), DFS(0), puts("NIE");
}
}AC;
int main()
{
int n;
for(scanf("%d",&n); n--; AC.Insert());
AC.Query();
return 0;
}
BZOJ.2938.[POI2000]病毒(AC自动机)的更多相关文章
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...
- BZOJ 2938: [Poi2000]病毒
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 693 Solved: 360[Submit][Status][Di ...
- BZOJ 2938 [Poi2000]病毒(AC自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2938 [题目大意] 给出一些病毒串,问是否存在不包含任何病毒串的无限长的字符串 [题解 ...
- BZOJ [Poi2000]病毒 AC自动机_DFS_细节
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- [POI2000]病毒 --- AC自动机
[POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ2938:[POI2000]病毒(AC自动机)
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- 【bzoj2938】[Poi2000]病毒 AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
随机推荐
- linux网络配置原理
一.网络连接的基本原理 http://www.cnblogs.com/dyllove98/archive/2013/08/06/3241294.html
- python內建模块之datetime
from:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193755 ...
- 【干货】DD 和 netcat实战---擦除数据和远控
原创:Unit 2: Linux/Unix Acquisition 2.1 Linux/Unix Acquistion Using dd Continued DD也是一个复制设备数据的工具,比特流复制 ...
- Convert Expression to Reverse Polish Notation
Given an expression string array, return the Reverse Polish notation of this expression. (remove the ...
- 公共语言运行库(CLR)开发系列课程(3):COM Interop基础 学习笔记
上章地址 什么是COM Component Object Model 组建对象模型 基于接口(Interface) 接口=协议 IID 标识接口 V-table 虚表 方式调用 单继承 对象(Obje ...
- C# UDP广播消息
首先是发送端: /// <summary> /// 发送UDP消息 /// </summary> /// <param name="msg">消 ...
- springcloud微服务架构搭建:服务调用
spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign. Ribbon是一个基于HTTP和TCP客户端的负载均衡器,类似nginx反向代理,可 ...
- css部分复习整理
CSS代码语法 css 样式由选择符和声明组成,而声明又由属性和值组成,如下图所示: 选择符:又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色,而其他的元素( ...
- MongoDB aggregate 运用篇(转)
http://www.cnblogs.com/qq78292959/p/4440679.html 最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregat ...
- jenkins免密添加SSH Servers
在配置ssh server时可以使用用户名秘密的方式登录,但有点不安全,只要有权限配置jenkins服务器的人就可以看到密码.所以可以利用ssh免密登录的方式链接ssh server. 1.在jenk ...