bzoj2938 poi病毒 AC自动机
思路:
要求构建一个字符串,使得这个字符串不包含给出的任意一个单词。
如果我们已经构建出了一个安全代码,放在ac自动机上跑,那么我们必定不能得到任何一个字符串,此时我们得到的fail指针必定是在一个环上循环,并且这个环不包含单词的末尾。
我们也知道fail指针最后是会指回0点的,那么此时我们其实就是要求一个环,这个换不包含单词末尾即可。加一个优化就是,如果fail指针指向的地方是末尾,那么这个地方等同于末尾。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
char s[maxn],p[maxn];
int trie[maxn][],cntword[maxn],fail[maxn],cnt=;
int n;
bool vis[maxn],ins[maxn];
void insert(char *s){
int root=;
int si=strlen(s);
for(int i=;i<si;i++)
{
int Next=s[i]-'';
if(!trie[root][Next])trie[root][Next]=++cnt;
root=trie[root][Next];
}
cntword[root]++;
}
void getfail(){
queue<int >q;
for(int i=;i<=;i++)
{
if(trie[][i]){
q.push(trie[][i]);
}
}
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=;i<=;i++)
{
if(trie[now][i]){
fail[trie[now][i]]=trie[fail[now]][i];
if(cntword[fail[trie[now][i]]])cntword[trie[now][i]]=;//如果fail指针指向的是病毒的末尾,那么这个也是病毒
q.push(trie[now][i]);
}else{
trie[now][i]=trie[fail[now]][i];
}
}
}
} void init(){
clr(trie,);
clr(cntword,);
clr(ins,),clr(vis,);
}
bool dfs(int u)
{
ins[u]=;
for(int i=;i<=;i++)
{
int v=trie[u][i];
if(ins[v]==)return true;
if(vis[v]||cntword[v])continue;
vis[v]=;
if(dfs(v))return true;
}
ins[u]=;
return false;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",p);
insert(p);
}
fail[]=;
getfail();
if(dfs())puts("TAK");
else puts("NIE"); }
bzoj2938 poi病毒 AC自动机的更多相关文章
- BZOJ2938[Poi2000]病毒——AC自动机
		
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
 - BZOJ2938:[POI2000]病毒(AC自动机)
		
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
 - LG2444/BZOJ2938 「POI2000」病毒  AC自动机
		
问题描述 LG2444 BZOJ2938 I \(\mathrm{AC}\)自动机 \(\mathrm{AC}\)自动机是一种多模式串匹配算法,本萌新今天刚学了它qwq 约定在构造\(\mathrm{ ...
 - 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
		
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
 - 【bzoj2938】[Poi2000]病毒  AC自动机
		
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
 - [bzoj2938][Poi2000]病毒_AC自动机
		
病毒 bzoj-2938 Poi-2000 题目大意:给你n个01串,问是否存在一个无限长的01串使得这个01的任意子串都不等于给出的01串. 注释:All_length<=30,000 想法: ...
 - [POI2000]病毒 --- AC自动机
		
[POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...
 - 计蒜客 疑似病毒 (AC自动机 + 可达矩阵)
		
链接 : Here! 背景 : 开始我同学是用 AC自动机 + DP 的方法来做这道题, 这道题的标签是 AC自动机, 动态规划, 矩阵, 按道理来说 AC自动机 + DP 应该是能过的, 但是他不幸 ...
 - BZOJ [Poi2000]病毒 AC自动机_DFS_细节
		
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
 
随机推荐
- 大前端涉猎之前后端交互总结2:使用PHP进行表单数据上传与更新
			
1:使用PHP进行表单上传 1.1 form表单的数据收集 HTML页面: 代码解释:核心模块是form的属性: --提交方式 : method="post" --指定 name ...
 - 流程控制语句(if、for、while、do  while、switch、 break、continue)
			
3:流程控制语句 (1)顺序结构 从上往下,依次执行 (2)选择结构 按照不同的选择,执行不同的代码 (3)循环结构 做一些重复的代码 4:if语句 (1)三种格式 ...
 - mybatis_入门程序
			
Mybatis入门 (一).程序环境 1.jar包 2.classpath目录下建立SqlMapConfig.xml. mybatis的配置文件.全部设置有如下 同时,数据库的参数可以用propert ...
 - Opengl中的GLUT下的回调函数
			
void glutDisplayFunc(void (*func)(void)); 注册当前窗口的显示回调函数 参数: func:形为void func()的函数,完成具体的绘制操作 这个函数告诉GL ...
 - SPARK_sql加载,hive以及jdbc使用
			
sql加载 格式 或者下面这种直接json加载 或者下面这种spark的text加载 以及rdd的加载 上述记得配置文件加入.mastrt("local")或者spark://m ...
 - MFC中cstring,string和char[]的相互转化
			
int 转 CString:CString.Format("%d",int);...............................string 转 CString CSt ...
 - java学习(一)数据类型
			
一.java的安装及环境变量的配置 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...
 - Android-Spinner下拉列表
			
在布局Layout文件中定义Spinner: <?xml version="1.0" encoding="utf-8"?> <LinearLa ...
 - Java50道经典习题-程序3 打印水仙花数
			
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...
 - 织梦CMS让channelartlist标签支持currentstyle【转】
			
打开include\taglib\channelartlist.lib.php找到 $pv->Fields['typeurl'] = GetOneTypeUrlA($typeids[$i]); ...