题目链接

\(Description\)

给n个模式串,问是否存在长度无限的主串,使得任何一个模式串都没有在主串中出现。

\(Solution\)

先建AC自动机。

假设我们有了一个无限长的安全代码,然后在AC自动机上匹配应该发生什么?

应该是匹配到一个位置失败跳回去,之后要再匹配到这个位置(必须跳回当前链)再失败跳回去。跳回去就是通过fail指针。

Trie树上连上fail指针的边后(其实就是Build时改的son),如果能在这个有向图上找到环,就TAK。

或者,安全代码无限长的话前后要能拼起来,即前后缀相同(同样要跳回当前链),且保证在这过程中不会匹配任何模式串。

前后缀相同就是通过fail指针跳回去(到当前链)。

建图(就是建AC自动机),DFS一遍就可以。注意如果fail[x]匹配,那么x也匹配。

注意访问过的点就没必要再访问了。

这题感觉理解不能,感觉AC自动机在从头开始学。。

//1408kb	72ms
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
const int N=30005; struct AC_Automaton
{
int tot,son[N][2],q[N],fail[N];
bool ed[N],vis[N],ins[N];
char s[N]; void Insert()
{
scanf("%s",s);
int l=strlen(s),x=0;
for(int i=0,v; i<l; ++i)
{
if(!son[x][v=s[i]-'0']) son[x][v]=++tot;
x=son[x][v];
}
ed[x]=1;
}
void Build()
{
int h=0,t=0;
if(son[0][0]) q[t++]=son[0][0];
if(son[0][1]) q[t++]=son[0][1];
while(h<t)
{
int x=q[h++];
ed[x]|=ed[fail[x]];//WA:fail[x]一定比x更早结束路径 fail[x]和x又不一定在同一条路径→_→
for(int i=0; i<2; ++i)
if(son[x][i]) fail[son[x][i]]=son[fail[x]][i], q[t++]=son[x][i];
else son[x][i]=son[fail[x]][i];
}
}
void DFS(int x)
{
if(ins[x]) puts("TAK"),exit(0);//如果是在当前链上,那也没有终止节点
if(vis[x]||ed[x]) return;
vis[x]=ins[x]=1;
DFS(son[x][0]), DFS(son[x][1]);
ins[x]=0;
}
void Query()
{
Build(), DFS(0), puts("NIE");
}
}AC; int main()
{
int n;
for(scanf("%d",&n); n--; AC.Insert());
AC.Query();
return 0;
}

BZOJ.2938.[POI2000]病毒(AC自动机)的更多相关文章

  1. BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]

    2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...

  2. BZOJ 2938: [Poi2000]病毒

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 360[Submit][Status][Di ...

  3. BZOJ 2938 [Poi2000]病毒(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2938 [题目大意] 给出一些病毒串,问是否存在不包含任何病毒串的无限长的字符串 [题解 ...

  4. BZOJ [Poi2000]病毒 AC自动机_DFS_细节

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  5. [POI2000]病毒 --- AC自动机

    [POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...

  6. 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS

    [BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...

  7. BZOJ2938[Poi2000]病毒——AC自动机

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...

  8. BZOJ2938:[POI2000]病毒(AC自动机)

    Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...

  9. 【bzoj2938】[Poi2000]病毒 AC自动机

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...

随机推荐

  1. Java基础-比较运算符Compare Operators

    Java基础-比较运算符Compare Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.关系运算符 关系运算符包括: 1>.大于(>) 2> ...

  2. logstash收集ngx日志

    if [type] =~ "ngx-" { #去掉重复的行 mutate { add_field => {"line_message" => &qu ...

  3. mysql 不同引擎的比较

    mysql 支持的默认引擎是InnoDB,其他的常用引擎包括MyISAM等,那么他们有什么差别呢. 首先执行 show engines; 来查看数据库当前支持的引擎. 可以看到mysql支持这么多不同 ...

  4. 8 Productivity hacks for Data Scientists & Business Analysts

    8 Productivity hacks for Data Scientists & Business Analysts Introduction I was catching up with ...

  5. 深度学习 vs. 概率图模型 vs. 逻辑学

    深度学习 vs. 概率图模型 vs. 逻辑学 摘要:本文回顾过去50年人工智能(AI)领域形成的三大范式:逻辑学.概率方法和深度学习.文章按时间顺序展开,先回顾逻辑学和概率图方法,然后就人工智能和机器 ...

  6. 使用WebHelper调用Asp.net WebAPI

    1.WebHelper using System; using System.Collections.Generic; using System.Collections.Specialized; us ...

  7. jq无缝滚动效果插件(之前的那个升级改造加强版)

    scroll滚动插件 支持上下左右,淡入淡出,滚动时间设置,动画时间设置,鼠标经过是否停止设置 默认配置参数可修改 $(".content").easysroll({ //默认配置 ...

  8. CF 1131B Draw!

    Draw! Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Descriptio ...

  9. CodeAction_beta02 斐波那契 (多维DP)

    题面: solution: 这题和斐波那契数列没有任何关系!!!!! 这题就是一个无脑DP!!!!!!!!!! 因为所有数都要出现至少一次,所以只需考虑其组合而不用考虑其排列,最后乘个 n!就是了(意 ...

  10. [CEOI2015 Day2]世界冰球锦标赛 (双向搜索)

    题目描述 [CEOI2015 Day2]世界冰球锦标赛译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.Bobek ...