【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 ...
随机推荐
- 20145209刘一阳 《网络对抗》逆向及BOF基础实践
直接修改程序机器指令,改变程序执行流程 在正式开始实践之前,先对pwn1文件做个备份,以便修改后可以及时恢复到初始状态: 使用指令objdump -d 20145209 | more对目标文件进行反汇 ...
- 从国内下载Linux的CentOS系统
http://mirror.nsc.liu.se/centos-store/7.3.1611/isos/x86_64/
- c++ singleton
http://www.yolinux.com/TUTORIALS/C++Singleton.html
- tomcat6升级到7时400问题,以及url带有汉字时出错。
tomcat6升级到7时400问题: 在文件catalina.properties后加入tomcat.util.http.parser.HttpParser.requestTargetAllow=|. ...
- hdu1517A Multiplication Game(巴什博弈变形)
A Multiplication Game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- Python搭配unittest
unittest是Python的单元测试框架, 类似于Java里面的TestNG. Unittest.py: import unittest from selenium import webdrive ...
- Unity编辑器 - TreeView控件笔记
用起来有一些规则,写个简单的案例以备查阅: using System.Collections.Generic; using UnityEditor.IMGUI.Controls; using Unit ...
- NGUI组件整理总结
一图流: 注意: private void RClickUI(Vector3 newPos) { this.gameObject.SetActive(true); this.transform.loc ...
- C++clock()延时循环
函数clock(),返回程序开始执行后所用的系统时间,但是有两个复制问题. 1.clock()返回时间的单位不一定是秒 2.该函数的返回类型在某些系统上可能是Long,也可能是unsigned lon ...
- js随机数算法
function rnd( seed ){ seed = ( seed * 9301 + 49297 ) % 233280; //为何使用这三个数? return seed / ( 233280.0 ...