BZOJ 2938 Poi2000 病毒 AC自动机+拓扑排序

题目大意:给定n个01串,问是否存在一个无限长的01串,不包含这n个01串中的任何一个

建出Trie图之后判环即可

我这傻逼一开始居然跑了一个DFS去判环23333

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 30300
using namespace std;
int n;
char s[M];
namespace Aho_Corasick_Automaton{
	struct Trie{
		Trie *son[2],*fail;
		bool ed;short into;
	}*root,mempool[M],*C=mempool;
	void Insert(Trie *&p,char *pos)
	{
		if(!p) p=new (C++)Trie;
		if(!*pos)
		{
			p->ed=true;
			return ;
		}
		Insert(p->son[*pos-'0'],pos+1);
	}
	void Build_Tree()
	{
		static Trie *q[M];
		int i,r=0,h=0;
		for(i=0;i<2;i++)
			if(root->son[i])
				(q[++r]=root->son[i])->fail=root;
			else
				root->son[i]=root;
		while(r!=h)
		{
			Trie *p=q[++h];
			for(i=0;i<2;i++)
			{
				if(p->son[i])
				{
					p->son[i]->fail=p->fail->son[i];
					p->son[i]->ed|=p->son[i]->fail->ed;
					q[++r]=p->son[i];
				}
				else
					p->son[i]=p->fail->son[i];
			}
		}
	}
	bool Find_Ring()
	{
		static Trie *temp,*q[M];
		int i,r=0,h=0,cnt=0;
		for(temp=mempool;temp<C;temp++)
			if(!temp->ed)
			{
				++cnt;
				for(i=0;i<2;i++)
					temp->son[i]->into++;
			}
		for(temp=mempool;temp<C;temp++)
			if(!temp->into&&!temp->ed)
				q[++r]=temp;
		while(r!=h)
		{
			Trie *p=q[++h];
			for(i=0;i<2;i++)
				if(!--p->son[i]->into&&!p->son[i]->ed)
					q[++r]=p->son[i];
		}
		return cnt!=r;
	}
}
int main()
{
	using namespace Aho_Corasick_Automaton;
	int i;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		scanf("%s",s+1);
		Insert(root,s+1);
	}
	Build_Tree();
	puts(Find_Ring()?"TAK":"NIE");
	return 0;
}
时间: 2024-11-08 01:33:20

BZOJ 2938 Poi2000 病毒 AC自动机+拓扑排序的相关文章

[bzoj 2938] [Poi2000]病毒]

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2938 [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 870  Solved: 447[Submit][Status][Discuss] Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出

bzoj 3172 后缀数组|AC自动机

后缀数组或者AC自动机都可以,模板题. /************************************************************** Problem: 3172 User: BLADEVIL Language: C++ Result: Accepted Time:424 ms Memory:34260 kb ****************************************************************/ //By BLADEVI

hihocoder 1457(后缀自动机+拓扑排序)

题意 给定若干组由数字构成的字符串,求所有不重复子串的和(把他们看成十进制),答案mod(1e9+7) 题解: 类似后缀数组的做法,把字符串之间用':'连接,这里用':'是因为':'的ascii码恰好是9的下一个 然后建立后缀自动机. 之后把其实只要把其中的所有':'边删去,就可以进行转移了 如果x连向了y,边权是c,那么有转移 dp[y] += dp[x]*10 + c*sz[x] 所以只要拓扑排序一下就好 (写这题wa了好几次,主要是在删边建立新图的过程出了问题) #include <ios

BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status][Discuss] Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词由小写字母组成,N<=200,单词长度不超过10^6

BZOJ 1559: [JSOI2009]密码( AC自动机 + 状压dp )

建AC自动机后, dp(x, y, s)表示当前长度为x, 在结点y, 包括的串的状态为s的方案数, 转移就在自动机上走就行了. 对于输出方案, 必定是由给出的串组成(因为<=42), 所以直接暴搜答案. 数据范围很小, 可以AC(复杂度懒得算了....) ------------------------------------------------------------------------------------------------ #include<cstdio> #in

BZOJ 2553 BeiJing2011 禁忌 AC自动机+矩阵乘法

题目大意:给定n个模式串,定义一个字符串的伤害为所有子串的划分中最多包含的模式串数量,求长度为len的字符串的伤害期望值 小五prpr,恋恋prpr,大小姐prpr 首先建立AC自动机 令f[i][j]表示长度为i的字符串在AC自动机上的第j个节点的伤害期望值 如果要走到某个节点是危险节点或者fail指针指向危险节点,就ans++,然后回到根节点 这样构造出来的矩阵做快速幂= = 这么做都会把- - 不会别骂我- - 但是跑完发现找不到答案- - 因此我们需要稍微改造一下- - 新建一个节点 如

Hnu 10104 病毒 (AC自动机+dfs)

病毒 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB Total submit users: 41, Accepted users: 23 Problem 10104 : No special judgement Problem description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找

2938: [Poi2000]病毒

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

BZOJ 3172: [Tjoi2013]单词 AC自动机

3172: [Tjoi2013]单词 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词由小写字母组成,N<=200,单词长度不超过10^6 Output 输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次. Sample Input 3 a aa aaa Sample Output 6 3 1 HINT 入门 #