[BZOJ2938]:[Poi2000]病毒
题目传送门
题目描述:
输入格式:
TAK
,否则输出NIE
。
01
11
00000
题解:
一看是多模式串,首先应该想到是AC自动机。
如果还不会AC自动机,可以转到这篇博客,个人感觉还是写的挺清楚的:AC自动机讲解+[HDU2222]:Keywords Search(AC自动机)。
那么我们考虑怎么去处理。
显然如果存在这么一个无限长的安全串的话,说明它在AC自动机里一直匹配不上,也就是说我们需要找到一个环,这个环中的每一个点都没有任何串在这个点结束。
首先,将所有的文字段压入AC自动机,然后搞Fail指针,基本操作,不再赘述。
end数组的含义为:第i个点有没有串在这里结束,有则为1,没有则为0。
代码时刻:
#include<bits/stdc++.h>
using namespace std;
int trie[30001][2],cnt=1;
char s[30001];
bool end[30001],flag[30001],vis[30001];
int nxt[30001],que[30001];
void insert(char *str)//构建Trie树
{int p=1;int len=strlen(str);for(int i=0;i<len;i++){int ch=str[i]-'0';if(!trie[p][ch])trie[p][ch]=++cnt;p=trie[p][ch];}end[p]=1;//结尾点标记为1
}
void build()
{for(int i=0;i<2;i++)trie[0][i]=1;que[1]=1;for(int head=1,tail=1;head<=tail;head++)for(int i=0;i<2;i++)if(!trie[que[head]][i])trie[que[head]][i]=trie[nxt[que[head]]][i];else{que[++tail]=trie[que[head]][i];nxt[trie[que[head]][i]]=trie[nxt[que[head]]][i];end[trie[que[head]][i]]|=end[nxt[trie[que[head]][i]]];//如果end[nxt[x]]的话,说明root->x是root->fail后缀。}
}
bool find(int x)
{vis[x]=1;for(int i=0;i<2;i++){if(vis[trie[x][i]])return 1;//如果这个点被访问过了,那么说明出现了一个环。if(end[trie[x][i]]||flag[trie[x][i]])continue;//发现这条路走不下去(end为1),或者是已经被走过了(flag为1)。flag[trie[x][i]]=1;//标记已经走过了这个点。if(find(trie[x][i]))return 1;//接着走下一个点。}vis[x]=0;return 0;
}
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",s);insert(s);}build();if(find(0))printf("TAK");else printf("NIE");return 0;
}
rp++
转载于:https://www.cnblogs.com/wzc521/p/11081909.html
[BZOJ2938]:[Poi2000]病毒相关推荐
- BZOJ2938:[POI2000] 病毒
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- bzoj2938: [Poi2000]病毒
被Star_Feel大爷带着做题 明显大力AC机然后找环 本来我一开始想的是先去有另一个病毒为前缀的病毒,结果今天早上写的时候偷懒没写 结果跳fail的时候会跳到中间...无语,Star_Feel大爷 ...
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ2938: [Poi2000]病毒(AC自动机)
Orz wlp 5min讲完后缀数组 题意 给出$n$个0, 1串 问是否可以构造出一个无限长的字符串使其不包含任意串 Sol 刚开始我试图假装自己不知道这是个AC自动机的题然后来做.发现根本不可能q ...
- BZOJ2938:[Poi2000]病毒
BZOJ2938:[Poi2000]病毒 考虑AC自动机匹配的过程 如果下一个节点是危险节点,我们就不跳到这个节点 如果下一个节点的 fail 是危险节点,我们也不跳到这个节点 这个标记在 getfa ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 609 Solved: 318 [Submit][Status][ ...
- 【BZOJ2938】病毒,AC自动机练习
传送门(权限题) 2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 462 Solved: 240 [Submit][S ...
- bzoj 2938: [Poi2000]病毒(AC自动机)
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1085 Solved: 541 [Submit][Status] ...
- BZOJ 2938: [Poi2000]病毒 ACAM
title BZOJ 2938 LUOGU 24444 简化题意: 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
最新文章
- docker学习路程之部署一个nginx
- ubuntu -- 不输入密码执行sudo
- 贵州师范学院计算机2级报名,贵州省2021年上半年计算机二级报名时间
- Core Foundation框架
- 在java中对null的理解
- RecyclerView(三)实现聊天窗口样式(Android 5.0 新特性)
- 使用监听器:定时清除map缓存的key value .
- 抖音短视频内容理解和推荐算法
- Enum定义位域, 即可以通过位操作来产生未命名的值
- linux —— ubuntu 初次安装问题
- android textwatcher 获取当前控件,使用TextWatcher实现EditText与TextView同步
- Primer设计PCR引物的方法,在线引物设计网站汇总整理
- Flutter Dio 报错is not a subtype of type ‘DioError‘
- opc ua与opc da区别_OPC,OPCDA,OPCUA
- gphp32.exe是什么文件?
- 使用ietest来模拟ie6丢失session问题解决方法
- 驭势领读 | 《让大象飞》:资本寒冬正好能让市场回归理性
- 玄武中专计算机动漫与游戏制作,正青春,不散场——玄武中专信息技术系举办2016级计算机动漫与游戏制作专业“3+3”学生毕业作品展开幕式...
- zabbix 主动监控与被动监控
- Go 语言开发工具 LiteIDE X36 发布
热门文章
- CoreAnimation —— CATransaction(隐式动画)
- (二)阅读器客户端开发实战_需求阐述
- hive环境搭建提示: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
- 技巧|利用 Python 实现多任务进程
- ios 折线图_《解神者》ios和安卓互通吗 ios和安卓互通分析
- c语言中小数乘法怎样写程序,四年级下册lbrack;小数乘法rsqb;知识点归纳
- 拼音开头有什么字_excel查找函数应用:如何提取姓名的拼音首字母
- Go程序崩溃现场应该如何保留?
- 单片机学习从入门到入土?这3个关键点导致!
- 关于学习Python的一点学习总结(50->描述符)