BZOJ2938:[POI2000]病毒(AC自动机)
Description
Input
Output
Sample Input
01
11
00000
Sample Output
NIE
Solution
QvQ现在才理解AC自动机buildfail的时候继承儿子其实就相当于把trie树补成trie图
对于这个题只需要建好trie图,然后在trie图上找一个环
为什么呢?因为我们如果拿一个安全代码在自动机上跑
一定会不停的跑而到不了单词的结束点,这就要求必须有个环
而且这个环要求必须经过根节点,且不经过一些限制节点
限制节点包括单词的结束节点,还有若一个点的fail指向的点是限制节点
那么这个点也是限制节点。
因为fail指向的是当前串的最长后缀,
fail指向的后缀都是病毒了,那当前串本身一定也是病毒了
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define N (100000+100)
using namespace std;
int Son[N][],Fail[N],End[N],Ind[N];
int n,sz,head[N],num_edge;
bool vis[N],flag;
char s[N];
queue<int>q; void Insert(char s[])
{
int now=,len=strlen(s);
for (int i=; i<len; ++i)
{
int x=s[i]-'';
if (!Son[now][x]) Son[now][x]=++sz;
now=Son[now][x];
}
++End[now];
} void Build_Fail()
{
for (int i=; i<=; ++i)
if (Son[][i])
q.push(Son[][i]);
while (!q.empty())
{
int now=q.front();
q.pop();
for (int i=; i<=; ++i)
{
if (!Son[now][i])
{
Son[now][i]=Son[Fail[now]][i];
continue;
}
Fail[Son[now][i]]=Son[Fail[now]][i];
if (End[Fail[Son[now][i]]]) End[Son[now][i]]++;
//因为fail指针指向的点代表的字符串一定是当前字符串的一个最长后缀
//若后缀都是病毒了,那他本身一定也是病毒了
q.push(Son[now][i]);
}
}
} int ins[N],used[N];
bool Dfs(int x)
{
ins[x]=;
for(int i=; i<; i++)
{
int v=Son[x][i];
if(ins[v])return ;
if(used[v]||End[v])continue;
used[v]=;
if(Dfs(v))return ;
}
ins[x]=;
return ;
} int main()
{
scanf("%d",&n);
for (int i=; i<=n; ++i)
scanf("%s",s),Insert(s);
Build_Fail();
if(Dfs())puts("TAK");
else puts("NIE");
}
BZOJ2938:[POI2000]病毒(AC自动机)的更多相关文章
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- 【bzoj2938】[Poi2000]病毒 AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- [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 ...
随机推荐
- Swift 高级运算符
本文转载至 http://my.oschina.net/sunqichao/blog?disp=2&catalog=0&sort=time&p=2 除了基本操作符中所讲的运算符 ...
- C++模板中的嵌套
在下面的程序中,我们创建了一个模板类用于实现Queue容器的部分功能,并且在模板类中潜逃使用了一个Node类.queuetp.h // queuetp.h -- queue template with ...
- Oracle里 用sql*plus 登陆时,用户名和密码是多少啊?
Oracle里sql*plus的用户名即system用户,密码是自己设置的密码. 如果密码忘记,可通过如下方法重置. 1.win键+R键,输入cmd,打开命令提示符. 2.输入sqlplus /nol ...
- C/C++对Lu系统内置动态对象进行运算符重载
欢迎访问Lu程序设计 C/C++对Lu系统内置动态对象进行运算符重载 1 说明 要演示本文的例子,你必须下载Lu32脚本系统.本文的例子需要lu32.dll.lu32.lib.C格式的头文件lu32. ...
- 我觉得epoll和select最大的区别
最近在用epoll,网速资料很多,大家都说epoll和select的区别比较大,而且select要不停遍历所有的fd,效率要低,而且fd有限制. 但是我认为二者最大的区别在于 先看代码 while ( ...
- MQTT的学习研究(二)moquette-mqtt 的使用之mqtt broker的启动
在MQTT 官网 (http://mqtt.org/software)中有众多MQTT的实现方式.具体参看官网,Moquette是基于Apache Mina 的模型的一个Java MQTT broke ...
- Linux 2.6.16 TCP连接速度异常的问题分析
版权声明:本文由余子军原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/104 来源:腾云阁 https://www.qclo ...
- 如何偷懒地用 PHP 搭建一个班级网站
版权声明:本文由李宜东原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/116 来源:腾云阁 https://www.qclo ...
- 3.node的url属性
node的url属性 1.parse: [Function: urlParse],2.format: [Function: urlFormat],3.resolve: [Function: urlRe ...
- PL/SQL developer 可以连接本地数据库,但是不可以连接远程数据库的解决方法
修改Oracle_home目录下的 network\ADMIN\tnsnames.ora 文件, 在其中增加远程数据库对应的记录,类似下边这样: .2_orcl = (DESCRIPTION = (A ...