【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 ...
随机推荐
- ipmitool命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/EricDing/p/8995263.html [root@localhost ~]# yum install -y i ...
- python如何与以太坊交互并将区块链信息写入SQLite
关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀.因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物.今天我们将观察 ...
- 更换 CentOS 7 的下载源为阿里云
http://blog.csdn.net/realghost/article/details/45949759
- webpack入门指南-step02
webpack 安装 1)安装前的准备:webpack是基于node环境的项目,所以使用前必须先安装node和npm. 在安装 Webpack 前,你本地环境需要支持 node.js.如果电脑没有装过 ...
- TeamWork#3,Week5,Scrum Meeting 11.9
由于经验不足和储备知识不够,最近我们的项目遇到了一些技术问题,需要对项目进行重新计划.我们总结了经验教训,找出了问题所在,明确了要补充的知识,加紧学习,将会在一周之内解决相关问题. 成员 已完成 待完 ...
- 第一阶段Spring个人总结
通过这一阶段的冲刺,我感到的是名义上的团队,而实际上却是一个人的事,每个人跟每个人都不一样,都有自己的特点,总会出些不必要的麻烦. 还有团队的进展也是看不到什么东西,说实话,这次我并没有太多关注团队的 ...
- 炸弹人——NABCD分析
炸弹人——NABCD分析结果 N:需求:本软件应用于学生,学生可以在课余时间放松心情,缓解学习压力. A:做法:使用Cocosdx和Visual Studio 2010结合,之间用Python使其结合 ...
- Maven3 用Maven创建第一个web项目(2)servlet演示
上一章用Maven新建了web项目成功后,本文演示在此基础上应用servlet. 1.首先修改pom.xml文件,添加servlet依赖 <project xmlns="http:// ...
- angularJS1笔记-(10)-自定义指令(templateUrl属性)
index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- jquery easyui datagrid getSelected getChecked获取选择行数据(勾选)数据
要想获得上图所选取的元素只能用getChecked getSelected不能进行多个选择,只能单选 /* getSelected取得选中的数据,否则为null */ var user=$(" ...