【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 ...
随机推荐
- Git使用列表(四)
最近,由于自己的一个项目,导致自己的关于自己的要使用Git的很多的命令,突然发现自己的git的还有许多不知道的东西 不过,在这个工作的过程中,也发现自己的一些很大的缺陷,就是自己题目理解力有限,明明就 ...
- 在线接口文档工具——ShowDoc
ShowDoc:https://www.showdoc.cc/ --待更.
- iOS 开发库相关(持续更新)
01-给任意view添加毛玻璃效果 https://github.com/JagCesar/iOS-blur 02-浮动式的textfield输入框(可用于登录界面) https://github ...
- 【progress】 进度条组件说明
progress 进度条组件 原型: <progress percent="[Float(0-100)]" show-info="[Boolean]" b ...
- CSS3自定义字体
原文摘自:https://www.cnblogs.com/moqiutao/archive/2015/12/23/5070463.html 总节: 1) 定义字体标准格式: @font-face { ...
- 166. Nth to Last Node in List
Description Find the nth to last element of a singly linked list. The minimum number of nodes in lis ...
- 手机端网页返回顶部js代码
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" cont ...
- Ubuntu—终端下重启与关机
重启命令 : 1.shutdown -r now 立刻重启 2.shutdown -r 10 过10分钟自动重启 3.shutdown -r 20:35 在时间为20:35 ...
- simhash和minhash实现理解
文本相似度算法 minhash minhash 1. 把文档A分词形成分词向量L 2. 使用K个hash函数,然后每个hash将L里面的分词分别进行hash,然后得到K个被hash过的集合 3. 分别 ...
- idea clion编译器
RNMV64P0LA-eyJsaWNlbnNlSWQiOiJSTk1WNjRQMExBIiwibGljZW5zZWVOYW1lIjoiY24gdHUiLCJhc3NpZ25lZU5hbWUiOiIiL ...