【题解】P2444 病毒
【题解】[P2444 POI2000]病毒
一道\(ac\)自动机好题...
考虑危险的字符串是什么意思,就是在这个文本串中有模式串的匹配,这样的匹配可以通过\(ac\)自动机完成。
那么给定一个字符串如何判断是否有病毒,直接就是看ac自动机是否匹配成功。
考虑“无限长的安全字符串”代表什么意思,就是在\(ac\)自动机找到一个环。可以用阉割版的\(tarjin\)
#include<bits/stdc++.h>
using namespace std;
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
#define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >
TMP inline ccf qr(ccf b){
char c=getchar();
int q=1;
ccf x=0;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
const int maxac=30005;
int n;
string x;
struct AC{
int son[2];
int fail;int cnt;
inline int& operator [](int o){
return son[o&1];
}
inline int& operator [](char o){
return son[(o-'0')&1];
}
}ac[maxac];
int act;
inline void build(int lit){
int now=0;
RP(t,0,lit-1){
if(!ac[now][x[t]])
ac[now][x[t]]=++act;
now=ac[now][x[t]];
}
ac[now].cnt++;
//cout<<"build="<<now<<endl;
}
queue< int > q;
inline void gen(){
RP(t,0,1)
if(ac[0][t])
q.push(ac[0][t]);
while(!q.empty()){
int now=q.front();
q.pop();
RP(t,0,1){
if(ac[now][t]){
ac[ac[now][t]].fail=ac[ac[now].fail][t];
ac[ac[now][t]].cnt|=ac[ac[ac[now].fail][t]].cnt;
q.push(ac[now][t]);
}
else
ac[now][t]=ac[ac[now].fail][t];
}
}
}
bool in[maxac];
bool usd[maxac];
void dfs(int now){
usd[now]=in[now]=1;
RP(t,0,1){
if(in[ac[now][t]])
puts("TAK"),exit(0);
if(!ac[ac[now][t]].cnt)
dfs(ac[now][t]);
}
in[now]=0;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=qr(1);
RP(t,1,n){
cin>>x;
build(x.length());
}
gen();
if(!ac[0].cnt)
dfs(0);
puts("NIE");
return 0;
}
【题解】P2444 病毒的更多相关文章
- 洛谷P2444 病毒【AC自动机】
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- 洛谷 - P2444 - 病毒 - AC自动机
https://www.luogu.org/problemnew/show/P2444 有点恶心,不太明白fail的意义. #include<bits/stdc++.h> using na ...
- 洛谷P2444 病毒 [POI2000] AC自动机
正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...
- p2444 病毒
传送门 分析 先用AC自动机将所有字符串存起来,之后我们从根节点跑一遍dfs 判断时我们只需要判断这个环有没有任意一个字符串的结尾就可以判断是否安全了 注意一个节点的信息需要累加上它fail指针所指位 ...
- P2444 [POI2000]病毒
P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...
- [洛谷P2444] [POI2000]病毒
洛谷题目链接:[POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会 ...
- BZOJ2938 & 洛谷2444:[POI2000]病毒——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2938 https://www.luogu.org/problemnew/show/P2444 二进制 ...
- 洛谷 P2444 [POI2000]病毒 解题报告
P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...
- P2444 [POI2000]病毒 AC自动机
P2444 [POI2000]病毒 #include <bits/stdc++.h> using namespace std; ; struct Aho_Corasock_Automato ...
随机推荐
- 【BZOJ1562】【jzyzOJ1730】【COGS409】NOI2009变换序列 二分图匹配
[问题描述] 对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换 ...
- 基于http的断点续传和多线程下载
HTTP协议的GET方法,支持只请求某个资源的某一部分: 206 Partial Content 部分内容响应: Range 请求的资源范围: Content-Range 响应的资源范围: 断点续传: ...
- 清理XCode无用的文件(转)
目录如下,直接删除即可: 1.移除对旧设备的支持 影响:可重新生成:再连接旧设备调试时,会重新自动生成.我移除了4.3.2, 5.0, 5.1等版本的设备支持. 路径: [~/Library/Deve ...
- centos 编译 安装php
安装phpcd /usr/local/srctar -zvxf php-5.3.10.tar.gzcd php-5.3.10mkdir -p /usr/local/php5 #建立php安装目录. ...
- linux中ps命令的用法说明
在linux中使用ps命令可以查看有哪些进程在运行和运行的状态.进程是否结束.进程有没有僵尸.哪些进程占用了过多的资源等等. ps命令最常用的是用于监控后台进程的工作情况. 名称:ps www. ...
- IDEA破解 2017 IDEA license server 激活(可用)
进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.PHP(注意:php要小写)即可~
- 二叉查找树BST----java实现
二叉查找树BST----java实现 1.二叉查找树简单介绍 二叉查找树 ...
- C++必知必会(1)
条款1数据抽象 抽象数据类型的用途在于将变成语言扩展到一个特定的问题领域.一般对抽象数据类型的定义须要准训下面步骤: 1. 为类型取一个描写叙述性的名字 2. 列出类型所能运行的操作 ...
- linux虚拟机上挂载U盘
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTQwMjU5Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- C#:用SqlBulkCopy来实现批量插入数据
SqlBulkCopy是.net2.0的新特性,平时用的很少,但是其功能却是非常强大,对于批量插入数据性能非常优越 代码 /// /// bulk插入/// private void BulkInse ...