【bzoj2938】病毒
Solution
这题的话。。一开始想的是不是上一个trie就消失了但是后来发现好像我还是太年轻qwq
比较容易联想到。。AC自动机,多串匹配嘛
然后就。。考虑一下AC自动机的匹配过程,就是一直沿着trie上的节点走然后没得走了就跳\(fail\)
那所以如果说我们要构造一个无限长的无法匹配到的串的话,首先在trie上面走的时候就不能碰到某个模式串的结尾节点,然后又因为要构造一个。。无限长的串。。那。。找一个环然后一直绕着走就好了
所以现在的问题就变成了,我们要在AC自动机上面找一个环,这个环中的每个点都不是结尾节点,并且每个点的\(fail\)都不是结尾节点(不然跳过去匹配一下就匹配上了,这个有点坑。。一开始WA了就是这个原因qwq)
那所以求完\(fail\)数组再从根dfs一下就好了
一个小trick就是为了。。方便的话。。我们在建\(fail\)的时候可以直接将失配的地方的\(ch\)直接指到\(fail\)跳转到的地方,这样就不用每次都借助\(fail\)来跳了(貌似是。。几百万年前机房的小伙伴给我科普的奇妙写法qwq)
代码大概长这个样子:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define MOD 1000000007
#define ll long long
using namespace std;
const int N=30010,AC=N,C=2;
int n,m;
char s[N];
namespace Ac{/*{{{*/
queue<int> q;
int ch[AC][C],cnt[AC],fail[AC],nok[AC],vis[AC];
int tot,rt;
void init(){tot=0; rt=0;}
int newnode(){
cnt[++tot]=0; return tot;
}
void insert(char *s,int len){
int now=rt,c;
for (int i=0;i<len;++i){
c=s[i]-'0';
if (!ch[now][c]) ch[now][c]=newnode();
now=ch[now][c];
}
nok[now]=true;
}
void build_fail(){
int u,v;
q.push(rt);
while (!q.empty()){
v=q.front(); q.pop();
for (int i=0;i<C;++i){
if (!ch[v][i]) {ch[v][i]=ch[fail[v]][i];continue;}
if (v){
if (nok[ch[fail[v]][i]])
nok[ch[v][i]]=true;
fail[ch[v][i]]=ch[fail[v]][i];
}
else
fail[ch[v][i]]=0;
q.push(ch[v][i]);
}
}
}
bool dfs(int x){
vis[x]=1;//ing
int u;
for (int i=0;i<C;++i){
u=ch[x][i];
if (nok[u]) continue;
if (vis[u]==1||(vis[u]==0&&dfs(u))) return true;
}
vis[x]=-1;//end
return false;
}
void solve(){
build_fail();
memset(vis,0,sizeof(vis));
bool ans=false;
ans=dfs(rt);
if (ans) printf("TAK\n");
else printf("NIE\n");
}
};/*}}}*/
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
Ac::init();
scanf("%d",&n);
for (int i=1;i<=n;++i){
scanf("%s",s);
Ac::insert(s,strlen(s));
}
Ac::solve();
}
【bzoj2938】病毒的更多相关文章
- bzoj2938 病毒
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- [BZOJ2938]病毒 (AC自动机+dfs)
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- 【bzoj2938】【Poi2000】病毒
题解: 对病毒串建立ac自动机: 有一个无限长的串等价于可以一直在自动机上匹配,等价于自动机上的转移有环: 当然前提是去掉病毒节点的fail子树: 写一个dfs记录是否在栈中,来过没有找到就不必再来了 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- [bzoj2938][Poi2000]病毒_AC自动机
病毒 bzoj-2938 Poi-2000 题目大意:给你n个01串,问是否存在一个无限长的01串使得这个01的任意子串都不等于给出的01串. 注释:All_length<=30,000 想法: ...
- LG2444/BZOJ2938 「POI2000」病毒 AC自动机
问题描述 LG2444 BZOJ2938 I \(\mathrm{AC}\)自动机 \(\mathrm{AC}\)自动机是一种多模式串匹配算法,本萌新今天刚学了它qwq 约定在构造\(\mathrm{ ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 609 Solved: 318[Submit][Status][Di ...
- bzoj2938: [Poi2000]病毒
建AC自动机,把所有病毒的节点都删掉,dfs判有没有环,有环就找得到. #include <iostream> #include <cstdio> #include <c ...
- 【bzoj2938】[Poi2000]病毒
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
随机推荐
- 420. Count and Say【LintCode java】
Description The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, ...
- 【java请求】- jmeter_jdbc脚本实战
一,导入 使用Jmeter运行Java脚本,需要用到Jmeter的提供的框架jar包(分别在jmeter目录下的lib和ext目录下)1.ApacheJMeter_core.jar2.ApacheJM ...
- 微软职位内部推荐-Senior Software Engineer II-Sharepoint
微软近期Open的职位: SharePoint is a multi-billion dollar enterprise business that has grown from an on-prem ...
- 微信小程序-----自定义验证码实现
这一段时间做小程序项目,使用的是mpvue的框架,需要自己实现验证码输入,模拟input的光标,上一个框输入后后一个框自动获取焦点,删除时从后往前依次删除.下图是整体效果: <template& ...
- [Ubuntu] sogou中文输入法安装
I install sogou 中文输入法 successfully, after following below steps: 1. install sogou pingyin by deb pac ...
- 2017软工第十周个人PSP
11.17--11.23本周例行报告 1.PSP(personal software process )个人软件过程. C(类别) C(内容) ST(开始时间) ET(结束时间) INT(间隔时间) ...
- Python语言基础
一.Python简介 Python是跨平台动态语言 特点:优雅.明确.简单 适用:web网站和网络服务:系统工具和脚步:包装其他语言开发的模块 不适用:贴近硬件(首选C):移动开发:IOS/Andro ...
- Java接口interface,匿名内部类
接口 1.接口内部为 常量+公用的抽象方法.类必须实现接口中的所有方法 2.接口的语法格式:不写abstract会自动添加,可以继承多个接口 修饰符不能使private,protected [修饰符] ...
- c# richBox内容转图片
1.自定义控件,继承richBox public class RichTextBoxPrintCtrl : RichTextBox { //private const double anInch = ...
- c# Application.run和form.show区别
Application.run(form):在当前线程上开始运行标准应用程序消息循环,并使指定窗体可见. form.show() :使指定窗体可见: 参照:https://blog.csdn.net/ ...