【bzoj2938】【Poi2000】病毒

题解:
- 对病毒串建立ac自动机;
- 有一个无限长的串等价于可以一直在自动机上匹配,等价于自动机上的转移有环;
- 当然前提是去掉病毒节点的fail子树;
- 写一个dfs记录是否在栈中,来过没有找到就不必再来了再记录一个vis保证复杂度;
- 然而。。。。。。我在找环的时候呆了很久,最后写了tarjan;
- 如果你也是有些tarjan的危险想法的话注意特判转移的自环的情况;
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,sz,ch[N][],fl[N],que[N],head,tail,vis[N],hd[N],o,dfn[N],idx,low[N],fg,del[N];
struct Edge{int v,nt;}E[N<<];
char s[N];
void adde(int u,int v){
if(u==v)fg=;
E[o]=(Edge){v,hd[u]};hd[u]=o++;
}
void get_fl(){
for(int i=;i<;i++)if(ch[][i]){
que[++tail]=ch[][i];
if(!vis[ch[][i]])adde(,ch[][i]);
}else {fg=;return;}
while(head<tail){
int u=que[++head];
for(int i=;i<;i++){
int&v=ch[u][i];
if(!v){
v=ch[fl[u]][i];
if(!vis[v])adde(u,v);
continue;
}
fl[v]=ch[fl[u]][i];
vis[v]|=vis[fl[v]];
if(!vis[v])adde(u,v);
que[++tail]=v;
}
}
}
void tarjan(int u){
if(fg)return ;
que[++head]=u;
dfn[u]=low[u]=++idx;
for(int i=hd[u];~i;i=E[i].nt){
int v=E[i].v;
if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
else if(!del[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
int cnt=,v;
do{
cnt++;
del[v=que[head--]]=;
}while(v!=u);
if(cnt > )fg=;
}
}
int main(){
// freopen("bzoj2938.in","r",stdin);
// freopen("bzoj2938.out","w",stdout);
memset(hd,-,sizeof(hd));
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s+);
int len=strlen(s+),u=;
for(int j=;j<=len;j++){
if(!ch[u][s[j]-''])ch[u][s[j]-'']=++sz;
u=ch[u][s[j]-''];
}
vis[u]=;
}
get_fl();
head=;tarjan();
if(fg)puts("TAK");else puts("NIE");
return ;
}bzoj2938
【bzoj2938】【Poi2000】病毒的更多相关文章
- [bzoj2938][Poi2000]病毒_AC自动机
病毒 bzoj-2938 Poi-2000 题目大意:给你n个01串,问是否存在一个无限长的01串使得这个01的任意子串都不等于给出的01串. 注释:All_length<=30,000 想法: ...
- BZOJ2938: [Poi2000]病毒(AC自动机)
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1678 Solved: 849[Submit][Status][D ...
- BZOJ2938 [Poi2000]病毒 和 BZOJ5261 Rhyme
[Poi2000]病毒 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- bzoj2938: [Poi2000]病毒
建AC自动机,把所有病毒的节点都删掉,dfs判有没有环,有环就找得到. #include <iostream> #include <cstdio> #include <c ...
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ2938:[POI2000]病毒(AC自动机)
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- BZOJ2938 [Poi2000]病毒 【AC自动机】
题目 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否存在 ...
- BZOJ2938 POI2000病毒
我们不能让重复过的字串出现在无限串上(就叫这个了...) 也就是要自动机一直能匹配但就是匹配不到,那么就是在自动机上找一个环. dfs判环即可.注意是个有向图. #include<bits/st ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 609 Solved: 318[Submit][Status][Di ...
随机推荐
- 初学node.js-nodejs中实现HTTP服务(3)
一.node.js实现服务端 创建hello-world-server.js文件,服务端源码如下: /** * node.js实现http服务端 */ var http = require('http ...
- MyBatis学习(一)————纯jdbc编程
什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...
- [redis] 几种redis数据导出导入方式
环境说明: 172.20.0.1 redis源实例 172.20.0.2 redis目标实例 172.20.0.3 任意linux系统 一.redis-dump方式 1.安装redis-dump工具 ...
- [奇葩问题] Error Domain=NSURLErrorDomain Code=-1003
问题描述: 新上线的产品,ios同事拿着一串报错来找我,日志如下:err =Error Domain=NSURLErrorDomain Code=-1003 "未能找到使用指定主机名的服务器 ...
- [java] jar file
查看 .jar 内的文件 jar tf jarfile.jar maven 项目中, java 读取目标文件 运行 mvn package 打包项目是, src/main/resources 下的文件 ...
- ORACLE中查询被锁定的表,以及如何解锁
http://www.cnblogs.com/weiyi1314/p/6813325.html
- final用户体验报告
本次没有新增用户,所联系的用户与beta版本相同 用户序号 用户来源 用户下载软件途径 用户姓名 用户描述(信息) 使用次数 用户评价 1 张恩聚 QQ发送可执行文件 周楠 吉林大学在读研究生 ...
- js获取浏览器窗口属性
网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...
- 深入理解JAVA集合系列三:HashMap的死循环解读
由于在公司项目中偶尔会遇到HashMap死循环造成CPU100%,重启后问题消失,隔一段时间又会反复出现.今天在这里来仔细剖析下多线程情况下HashMap所带来的问题: 1.多线程put操作后,get ...
- 安装virtualbox
1.安装virtualbox https://www.virtualbox.org/ 2.安装centos6.6 3.配置网络 右键-->网络-->网卡2-->host-only c ...