P2444 [POI2000]病毒 AC自动机
#include <bits/stdc++.h>
using namespace std;
const int maxn = ; struct Aho_Corasock_Automaton {
struct node {
int fail; // 失配指针
int son[]; // 子节点的位置
bool danger; // 危险标记
}Trie[maxn];
int cnt = ; // Trie指针
void insert(char *s) {
int len = strlen(s);
int now = ; // Trie当前指针
for (int i = ; i < len; ++i) {
if (Trie[now].son[s[i]-''] == ) { // 如果没有这个子节点
Trie[now].son[s[i]-''] = ++cnt; // 构造该节点
}
now = Trie[now].son[s[i]-''];
}
Trie[now].danger = true;
}
void get_fail() { // 构造fail指针
queue<int> que;
for (int i = ; i < ; ++i) { // 先提前构造第二层
if (Trie[].son[i] != ) { // 如果存在该节点
Trie[Trie[].son[i]].fail = ; // fail指向root节点
que.push(Trie[].son[i]); // 加入队列
}
}
while (!que.empty()) { // bfs求fail指针
int u = que.front(); que.pop();
for (int i = ; i < ; ++i) {
if (Trie[Trie[u].fail].danger == true)
Trie[u].danger = true;
if (Trie[u].son[i] != ) { // 如果存在该子节点
// 子节点的fail指针指向当前节点的fail指针指向内容相同的子节点
Trie[Trie[u].son[i]].fail = Trie[Trie[u].fail].son[i];
que.push(Trie[u].son[i]); // 加入队列
}
else { // 如果不存在这个子节点
// 当前节点的该子节点指向当前节点的fail指针指向的止隔子节点
Trie[u].son[i] = Trie[Trie[u].fail].son[i];
}
}
}
}
}AC;
bool vis[maxn];
bool dfs(int u) {
if (vis[u] == true) return true;
vis[u] = true;
if (!AC.Trie[AC.Trie[u].son[]].danger) {
if (dfs(AC.Trie[u].son[])) {
return true;
}
}
if (!AC.Trie[AC.Trie[u].son[]].danger) {
if (dfs(AC.Trie[u].son[])) {
return true;
}
}
vis[u] = false;
return false;
}
char t[maxn];
int main() {
int n; scanf("%d",&n);
for (int i = ; i <= n; ++i) {
scanf("%s",t);
AC.insert(t);
}
AC.get_fail();
if (dfs() == true) puts("TAK"); // 从字典树的根结点开始找环
else puts("NIE");
return ;
}
P2444 [POI2000]病毒 AC自动机的更多相关文章
- 【洛谷】P2444 [POI2000]病毒——AC自动机
题目链接 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段, ...
- [POI2000]病毒 --- AC自动机
[POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ2938:[POI2000]病毒(AC自动机)
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- 【bzoj2938】[Poi2000]病毒 AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ [Poi2000]病毒 AC自动机_DFS_细节
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- BZOJ.2938.[POI2000]病毒(AC自动机)
题目链接 \(Description\) 给n个模式串,问是否存在长度无限的主串,使得任何一个模式串都没有在主串中出现. \(Solution\) 先建AC自动机. 假设我们有了一个无限长的安全代码, ...
随机推荐
- css3--弹性布局
来源:https://www.cnblogs.com/xuyuntao/articles/6391728.html
- 《JAVA8开发指南》使用流式操作
为什么需要流式操作 集合API是Java API中最重要的部分.基本上每一个java程序都离不开集合.尽管很重要,但是现有的集合处理在很多方面都无法满足需要. 一个原因是,许多其他的语言或者类库以声明 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第五周作业
<Linux内核原理与分析>第五周作业 一.上周问题总结: 虚拟机将c文件汇编成汇编文件时忘记添加include<stdio.h> gdb跟踪汇编过程不熟练 二.本周学习内容: ...
- linux rpm包
rpm包,软件包,程序包,以.rpm结尾的包 我们刚开始安装的Linux系统是最小化安装(minimol),只安装系统,不安装不必要的软件包 刚开始vim,ifconfig,tree等命令都没有,当然 ...
- java中异常的处理
异常分为运行时的异常和检测异常: java提供了两种异常机制.一种是运行时异常(RuntimeExepction),一种是检查式异常(checked execption). 运行时的异常就是在java ...
- Redis(一):数据结构与对象
前言 本书是Redis设计与实现的读书笔记,旨在对Redis底层的数据结构及实现有一定了解.本书所有的代码基于Redis 3.0. 简单动态字符串 SDS Redis没有直接使用C语言中的字符串,而是 ...
- Java反射与注解
反射 能够分析类能力的程序称为反射(reflective),代码的这种能力称为"自省".反射机制的功能极其强大,反射机制可以用来: 在运行时分析类的能力 在运行时查看对象,例如,编 ...
- postman(全局变量设置)
全局变量 全局变量作用于整个postman工具及所有环境 1.点击小齿轮进入到变量添加页面,点击Globals添加全局变量 2.输入变量名称和变量值 3.接口中设置变量 4.调用 Globals 变量 ...
- 3) drf 框架生命周期 请求模块 渲染模块 解析模块 自定义异常模块 响应模块(以及二次封装)
一.DRF框架 1.安装 pip3 install djangorestframework 2.drf框架规矩的封装风格 按功能封装,drf下按不同功能不同文件,使用不同功能导入不同文件 from r ...
- andorid jar/库源码解析之okhttp3
目录:andorid jar/库源码解析 Okhttp3: 作用: 用于网络编程(http,https)的快速开发. 栗子: // okHttpClient定义成全局静态,或者单例,不然重复new可能 ...