[bzoj2938][Poi2000]病毒_AC自动机
病毒 bzoj-2938 Poi-2000
题目大意:给你n个01串,问是否存在一个无限长的01串使得这个01的任意子串都不等于给出的01串。
注释:All_length<=30,000
想法:裸题,介绍一下AC自动机。
什么是AC自动机?简单讲,就是Trie+KMP。KMP就是单模字符串匹配算法,基于next数组求出最长前缀后缀,增加匹配效率。多模匹配,就是好几个字符串之间匹配是否出现过或有什么性质等。这样效率太低,我们就把它们都扔到Trie树上。然后引进fail指针,就相当于next。
附上求fail的模板
void getfail()
{
while(!q.empty()) q.pop();
for(int i=0;i<26;i++)
{
if(a[0][i])
{
fail[a[0][i]]=0;
q.push(a[0][i]);
}
}
while(!q.empty())
{
int now=q.front();q.pop();
for(int i=0;i<26;i++)
{
if(a[now][i])
{
fail[a[now][i]]=a[fail[now]][i];
q.push(a[now][i]);
}
else a[now][i]=a[fail[now]][i];
}
}
}
关于这道题,我们只需要给予Trie和fail指针跑出一个环即可,用两个数组vist和all_visit,分别表示当前走过的点和全局走过的点,visit实时更新即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 30001
using namespace std;
struct tree
{
int fail,vis[3];
bool end;
}a[N];
int cnt,num;
char s[N];
bool all_visit[N],visit[N];
void build(char *s)//建立Trie树
{
int l=strlen(s);
int now=0;
for(int i=0;i<l;i++)
{
int x=(s[i]-'0');
if(a[now].vis[x]==0)
{
a[now].vis[x]=++cnt;
}
now=a[now].vis[x];
}
a[now].end=true;
}
queue<int>q;
void bfs()
{
while(!q.empty()) q.pop();
for(int i=0;i<2;i++)//将根节点的两个儿子扔进队列
{
if(a[0].vis[i])
{
a[a[0].vis[i]].fail=0;
q.push(a[0].vis[i]);
}
}
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=0;i<2;i++)
{
if(a[now].vis[i])
{
a[a[now].vis[i]].fail=a[a[now].fail].vis[i];
q.push(a[now].vis[i]);
if(a[a[a[now].fail].vis[i]].end)
{
a[a[now].vis[i]].end=true;
}
}
else
{
a[now].vis[i]=a[a[now].fail].vis[i];
}
}
}
}
void dfs(int d)
{
visit[d]=true;
for(int i=0;i<2;i++)
{
if(visit[a[d].vis[i]])
{
printf("TAK");
exit(0);
}
else if(!a[a[d].vis[i]].end&&!all_visit[a[d].vis[i]])
{
all_visit[a[d].vis[i]]=true;
dfs(a[d].vis[i]);
}
}
visit[d]=false;
}
int main()
{
int n;
cin >> n ;
for(int i=1;i<=n;i++)
{
scanf("%s",s);
build(s);
}
a[0].fail=0;
bfs(),dfs(0);
printf("NIE");
return 0;
}
小结:AC自动机还是很强的qwq。
[bzoj2938][Poi2000]病毒_AC自动机的更多相关文章
- BZOJ_2938_[Poi2000]病毒_AC自动机
BZOJ_2938_[Poi2000]病毒_AC自动机 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们 ...
- BZOJ2938[Poi2000]病毒——AC自动机
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- BZOJ2938:[POI2000]病毒(AC自动机)
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- BZOJ2938: [Poi2000]病毒(AC自动机)
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1678 Solved: 849[Submit][Status][D ...
- [POI2000]病毒 --- AC自动机
[POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...
- BZOJ2938 [Poi2000]病毒 和 BZOJ5261 Rhyme
[Poi2000]病毒 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...
- P2444 [POI2000]病毒 AC自动机
P2444 [POI2000]病毒 #include <bits/stdc++.h> using namespace std; ; struct Aho_Corasock_Automato ...
随机推荐
- How to Integrate .NET Projects with Jenkins
https://www.swtestacademy.com/jenkins-dotnet-integration/ 8) Unit Tests and Test Coverage Settings D ...
- Android中关于内部存储的一些重要函数
一.简介 Android中,你也可以通过绝对路径以JAVA传统方式访问内部存储空间.但是以这种方式创建的文件是对私有,创建它的应用程序对该文件是可读可写,但是别的应用程序并不能直接访问它.不是所有的内 ...
- TCP打开文件传输(服务器端并发code)
#include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>#include <sys/types. ...
- (Go)07.Go语言中strings和strconv包示例代码详解01
1.strings使用 前缀和后缀 HasPrefix判断字符串s是否以prefix开头: 示例: package main import ( "fmt" "string ...
- js基本功能大全
1.javascript的数组API: //定义数组 var pageIds = new Array(); pageIds.push('A'); 数组长度 pageIds.length; //shif ...
- [BZOJ1601] 灌水
难点:找到正确方式建图 知识点:Kruskal 分析:这种题肯定要把点权转换到边权上,但肯定无法搞到和其他点相连的边上,怎么办呢?那就再造一个点呗,这个“超级点”和所有点相连,且边权=点权,于是就可以 ...
- Multipart/form-data POST文件上传
简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form method="post"action=&qu ...
- 删除django
1.命令行运行python 2.import django3.print(django.__path__)4.删除django目录即可
- Android学习——数据存储之文件存储
将数据存储到文件中并读取数据 1.新建FilePersistenceTest项目,并修改activity_main.xml中的代码,如下:(只加入了EditText,用于输入文本内容,不管输入什么按下 ...
- servlet_获取初始化参数
在web.xml的<servlet>标签中增添 <init-param> <param-name>XXX</param-name> <param- ...