2938: [Poi2000]病毒
题意:判断是否存在无限长的不含模式串的字符串。只有01.
建出套路DP的转移图,判断有环就行了
练习一下拓扑排序
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=3e4+5;
typedef long long ll;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n; char s[N];
struct edge{int v, ne;}e[N];
int cnt=1, h[N], ind[N];
inline void ins(int u, int v) {e[++cnt]=(edge){v, h[u]}; h[u]=cnt; ind[v]++;}
namespace ac {
struct meow{int ch[2], fail, val;} t[N];
int sz;
void insert(char *s) {
int len=strlen(s+1), u=0;
for(int i=1; i<=len; i++) {
int c=s[i]-'0';
if(!t[u].ch[c]) t[u].ch[c] = ++sz;
u = t[u].ch[c];
}
t[u].val=1;
}
int q[N], head, tail;
void build() {
head=tail=1;
for(int i=0; i<2; i++) if(t[0].ch[i]) q[tail++]=t[0].ch[i];
while(head != tail) {
int u=q[head++];
t[u].val |= t[t[u].fail].val;
for(int i=0; i<2; i++) {
int &v=t[u].ch[i];
if(!v) v = t[t[u].fail].ch[i];
else t[v].fail = t[t[u].fail].ch[i], q[tail++]=v;
}
}
for(int u=0; u<=sz; u++) if(!t[u].val)
for(int i=0; i<=1; i++) if(!t[t[u].ch[i]].val) ins(u, t[u].ch[i]);
}
}
int st[N], top;
bool circle(int n) {
for(int i=0; i<=n; i++) if(!ind[i]) st[++top]=i;
int tot=0;
while(top) {
int u=st[top--]; tot++;
for(int i=h[u];i;i=e[i].ne) {
ind[e[i].v]--;
if(!ind[e[i].v]) st[++top]=e[i].v;
}
}
return tot != n+1;
}
int main() {
freopen("in","r",stdin);
n=read();
for(int i=1; i<=n; i++) scanf("%s",s+1), ac::insert(s);
ac::build();
puts(circle(ac::sz) ? "TAK" : "NIE");
}
BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]的更多相关文章
-
BZOJ.2938.[POI2000]病毒(AC自动机)
题目链接 \(Description\) 给n个模式串,问是否存在长度无限的主串,使得任何一个模式串都没有在主串中出现. \(Solution\) 先建AC自动机. 假设我们有了一个无限长的安全代码, ...
-
BZOJ 2938: [Poi2000]病毒
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 693 Solved: 360[Submit][Status][Di ...
-
BZOJ 2938 [Poi2000]病毒(AC自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2938 [题目大意] 给出一些病毒串,问是否存在不包含任何病毒串的无限长的字符串 [题解 ...
-
BZOJ [Poi2000]病毒 AC自动机_DFS_细节
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
-
【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
-
bzoj2938 AC自动机 + 拓扑排序找环
https://www.lydsy.com/JudgeOnline/problem.php?id=2938 题意:给出N个01病毒序列,询问是否存在一个无限长的串不存在病毒序列 正常来说,想要寻找一个 ...
-
[POI2000]病毒 --- AC自动机
[POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...
-
BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
-
BZOJ2938:[POI2000]病毒(AC自动机)
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
随机推荐
-
Windows2003远程桌面单会话登录
在使用远程桌面连接到Windows2003的时候默认设置是同一用户可以进行多会话登录. (在winxp.win7及以后版本的windows中已经变成单会话登录.) 同用户多会话登录在管理上带来诸多麻烦 ...
-
poi导出Excel报表多表头双层表头、合并单元格
效果图: controller层方法: /** * * 导出Excel报表 * @param request * @return * */ @ ...
-
深入理解CRITICAL_SECTION
临界区是一种防止多个线程同时执行一个特定代码节的机制,这一主题并没有引起太多关注,因而人们未能对其深刻理解.在需要跟踪代码中的多线程处理的性能时,对 Windows 中临界区的深刻理解非常有用.本文深 ...
-
3036: 绿豆蛙的归宿 - BZOJ
Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点.到达每 ...
-
Android编译提示ImportError: No module named bz2的解决办法
在安装node.js时提示ImportError: No module named bz2.很明显这个python中没有装bz2的库导致的.解决方法:sudo apt-get install libb ...
-
基于url的权限管理
基于url权限管理流程 完成权限管理的数据模型创建. 1. 系统登陆 系统 登陆相当 于用户身份认证,用户成功,要在session中记录用户的身份信息. 操作流程: 用户进行登陆页面 输入用户 ...
-
project euler 14 collatz
def collatz(num,i): i =i + 1 if num%2 == 0: return collatz(num//2,i) elif num == 1: return i else: r ...
-
linux centos7.0安装subversion
安装环境以及软件版本如下: subversion使用1.8.17版本,CentOS7.0(64位) 安装svn共需要使用如下软件,apr-1.5.2.tar.gz.apr-util-1.5.4.tar ...
-
source Insight 添加python 工程
1. 下载python的识别文件 Python.CLF 2.设置
-
Flutter - 本地化语言
Flutter有很多本地化的packages使用,我现在用的是 flutter_i18n 项目主页:https://pub.dartlang.org/packages/flutter_i18n 1.安 ...