[日常摸鱼][POI2000]病毒-Tire图(AC自动机)+dfs
https://www.luogu.org/problemnew/show/P2444
(没有bzoj权限号T_T)
字符串题对我这种傻逼来说真是太难了x
题意:输入$n$个01组成的模式串串,判断是否存在一个无限长的01串满足任何给定的模式串都不是这个串的子串,$n \leq 2000,\sum len(str) \leq 30000$
首先用模式串构造出AC自动机(其实应该叫Trie图),题目要求的串如果存在,那就相当于在Trie图上存在一个环,这个环不包含任何一个模式串,所以只要构造出来Tire图判断是否存在这样子的环,注意如果Tire图上的某个点$x$是一个模式串的结尾,那么不仅不能够经过$x$,而且不能经过所有包含这个后缀的串,根据$fail$指针的定义就可以直接这样写:
danger[tr[k][i]]|=danger[fail[tr[k][i]]];
完整的代码:
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=30005;
int n,cnt;
int tr[N][2],fail[N];
bool danger[N],vis[N],mark[N],flag;
char s[N];
queue<int>q;
inline void insert(char *c)
{
int len=strlen(c+1),k=0;
for(register int i=1;i<=len;i++)
{
int t=c[i]-'0';
if(!tr[k][t])tr[k][t]=++cnt;
k=tr[k][t];
}danger[k]=1;
} inline void build()
{
if(tr[0][0])fail[tr[0][0]]=0,q.push(tr[0][0]);
if(tr[0][1])fail[tr[0][1]]=0,q.push(tr[0][1]);
while(!q.empty())
{
int k=q.front();q.pop();
for(register int i=0;i<=1;i++)
{
if(!tr[k][i])tr[k][i]=tr[fail[k]][i];
else
{
fail[tr[k][i]]=tr[fail[k]][i];
danger[tr[k][i]]|=danger[fail[tr[k][i]]];//
q.push(tr[k][i]);
}
}
}
} inline int dfs(int x)
{
vis[x]=1;
for(register int i=0;i<=1;i++)
{
int k=tr[x][i];
if(vis[k])return 1;
if(mark[k]||danger[k])continue;
mark[k]=1;
if(dfs(k))return 1;
}
vis[x]=0;return 0;
} int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%s",s+1);insert(s);
}
build();
if(dfs(0))printf("TAK");
else printf("NIE");
return 0;
}
[日常摸鱼][POI2000]病毒-Tire图(AC自动机)+dfs的更多相关文章
- BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...
- BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组
题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小 ...
- [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵
今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- [luoguP2444] [POI2000]病毒(AC自动机 + dfs)
传送门 先把所有串建一个AC自动机, 如果要找一个不包含任意一个串的串, 说明这个串一直在AC自动机上匹配但匹配不到, 也就是说,匹配时除去val值为1的点,除去fail指针指向val值为1的点,是否 ...
- HDU 2896 病毒侵袭(AC自动机水)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- [BZOJ2938]病毒 (AC自动机+dfs)
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- HDU 2896 病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2896 病毒侵袭【AC自动机】
<题目链接> Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一 ...
随机推荐
- mybatis使用细节注意
mybatis细节 增删改查ParameterType都可以不用写 解释这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数 mybatis 中 ...
- 教您使用OCR编辑器复制文档内容
ABBYY FineReader 15允许用户复制图像或者扫描页面上的内容,可复制其中的文本.图片和表格的信息.在复制过程中,用户无需将图像或扫描页面转换为可编辑的格式,可以直接在ABBYY Fine ...
- Boom 3D支持的音乐都有什么格式
Boom 3D作为一款专业的3D环绕音效软件,支持多种音频.视频播放格式,除了常用的MP3.WMA.WAV音频格式外,Boom 3D还支持FLAC.AAC这些比较高级的音频格式.同时,Boom 3D还 ...
- jQuery 第六章 实例方法 动画
.show() .hide() .toggle() .fadeIn() .fadeout() .fadeToggle() .fadeTo() .slideDown() .slideUp() .slid ...
- python中操作excel数据
python操作excel,python有提供库 本文介绍openpyxl,他只支持新型的excell( xlsx)格式,读取速度还可以 1.安装 pip install openpyxl 2.使用 ...
- 记录一下Comparator的用法
Collections.sort(res, new Comparator<ArrayList<Integer>>() { @Override ...
- maven打包时报No compiler is provided in this environment处理
系统:macOS 开发工具:Idea 问题描述:在idea中执行mvn clean install时报No compiler is provided in this environment. Perh ...
- C语言基础知识:几种特殊的函数宏封装方式
函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销. 函数宏本质上为宏,可以直接进行定义,例如: #define INT ...
- SpringIOC循环依赖
目录 1. 什么是循环依赖 注意: 这⾥不是函数的循环调⽤,是对象的相互依赖关系. 循环调⽤其实就是⼀个死循环,除⾮有终结 条件. 2. 循环依赖处理机制 2.1 演示场景: 2.2 处理机制简图 总 ...
- vm虚拟机安装centos7。克隆镜像以及快照
为了方便下次安装配置,保存一篇安装centos的文章 https://blog.csdn.net/wsq119/article/details/80635558 步骤非常详细,一看就会. 这一篇是关于 ...