题目传送门


题目描述:

二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。
示例:
例如如果{011, 11, 00000}为病毒代码段,那么一个可能的无限长安全代码就是010101…。如果{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。
请写一个程序,读入病毒代码,判断是否存在一个无限长的安全代码,将结果输出。


输入格式:
第一行包括一个整数n,表示病毒代码段的数目。以下的n行每一行都包括一个非空的01字符串——就是一个病毒代码段。


输出格式:
第一行输出一个单词。假如存在这样的代码,则输出TAK,否则输出NIE


样例:
样例输入:
3
01
11
00000
样例输出:
NIE


数据范围与提示:
对于全部数据,所有病毒代码段的总长度不超过3×104


题解:

一看是多模式串,首先应该想到是AC自动机。

如果还不会AC自动机,可以转到这篇博客,个人感觉还是写的挺清楚的:AC自动机讲解+[HDU2222]:Keywords Search(AC自动机)。

那么我们考虑怎么去处理。

显然如果存在这么一个无限长的安全串的话,说明它在AC自动机里一直匹配不上,也就是说我们需要找到一个环,这个环中的每一个点都没有任何串在这个点结束。

首先,将所有的文字段压入AC自动机,然后搞Fail指针,基本操作,不再赘述。

end数组的含义为:第i个点有没有串在这里结束,有则为1,没有则为0。

不过需要注意的是,如果一个点的Fail指针指向的点的end为1,那么它也要为1,因为如果它的Fail指针指向的点的end为1的话,说明从根结点到Fail所组成的串是从跟节点到它所组成的串的后缀。
这些都处理好之后,我们就看着是不是一个环就好了。


代码时刻:

#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]病毒相关推荐

  1. BZOJ2938:[POI2000] 病毒

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

  2. bzoj2938: [Poi2000]病毒

    被Star_Feel大爷带着做题 明显大力AC机然后找环 本来我一开始想的是先去有另一个病毒为前缀的病毒,结果今天早上写的时候偷懒没写 结果跳fail的时候会跳到中间...无语,Star_Feel大爷 ...

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

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

  4. BZOJ2938: [Poi2000]病毒(AC自动机)

    Orz wlp 5min讲完后缀数组 题意 给出$n$个0, 1串 问是否可以构造出一个无限长的字符串使其不包含任意串 Sol 刚开始我试图假装自己不知道这是个AC自动机的题然后来做.发现根本不可能q ...

  5. BZOJ2938:[Poi2000]病毒

    BZOJ2938:[Poi2000]病毒 考虑AC自动机匹配的过程 如果下一个节点是危险节点,我们就不跳到这个节点 如果下一个节点的 fail 是危险节点,我们也不跳到这个节点 这个标记在 getfa ...

  6. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 609  Solved: 318 [Submit][Status][ ...

  7. 【BZOJ2938】病毒,AC自动机练习

    传送门(权限题) 2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 462 Solved: 240 [Submit][S ...

  8. bzoj 2938: [Poi2000]病毒(AC自动机)

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1085  Solved: 541 [Submit][Status] ...

  9. BZOJ 2938: [Poi2000]病毒 ACAM

    title BZOJ 2938 LUOGU 24444 简化题意: 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...

最新文章

  1. docker学习路程之部署一个nginx
  2. ubuntu -- 不输入密码执行sudo
  3. 贵州师范学院计算机2级报名,贵州省2021年上半年计算机二级报名时间
  4. Core Foundation框架
  5. 在java中对null的理解
  6. RecyclerView(三)实现聊天窗口样式(Android 5.0 新特性)
  7. 使用监听器:定时清除map缓存的key value .
  8. 抖音短视频内容理解和推荐算法
  9. Enum定义位域, 即可以通过位操作来产生未命名的值
  10. linux —— ubuntu 初次安装问题
  11. android textwatcher 获取当前控件,使用TextWatcher实现EditText与TextView同步
  12. Primer设计PCR引物的方法,在线引物设计网站汇总整理
  13. Flutter Dio 报错is not a subtype of type ‘DioError‘
  14. opc ua与opc da区别_OPC,OPCDA,OPCUA
  15. gphp32.exe是什么文件?
  16. 使用ietest来模拟ie6丢失session问题解决方法
  17. 驭势领读 | 《让大象飞》:资本寒冬正好能让市场回归理性
  18. 玄武中专计算机动漫与游戏制作,正青春,不散场——玄武中专信息技术系举办2016级计算机动漫与游戏制作专业“3+3”学生毕业作品展开幕式...
  19. zabbix 主动监控与被动监控
  20. Go 语言开发工具 LiteIDE X36 发布

热门文章

  1. CoreAnimation —— CATransaction(隐式动画)
  2. (二)阅读器客户端开发实战_需求阐述
  3. hive环境搭建提示: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
  4. 技巧|利用 Python 实现多任务进程
  5. ios 折线图_《解神者》ios和安卓互通吗 ios和安卓互通分析
  6. c语言中小数乘法怎样写程序,四年级下册lbrack;小数乘法rsqb;知识点归纳
  7. 拼音开头有什么字_excel查找函数应用:如何提取姓名的拼音首字母
  8. Go程序崩溃现场应该如何保留?
  9. 单片机学习从入门到入土?这3个关键点导致!
  10. 关于学习Python的一点学习总结(50->描述符)