BZOJ 2938 [POI2000]病毒 (剪枝/A*迭代搜索)
题目大意:给你一些模式串,问是否存在一个无限长的文本串,不包含任何一个给定的模式串
并没有想到去模拟合法的文本串在模式串的Trie图上匹配的过程..我好菜啊
如果一个字符串合法,那么它的每个子串都不是任何一个模式串的结尾,即沿着Fail链跳到根的每个点都不是结尾
一个合法文本串在模式串构成的Trie图上匹配的过程中,会不断沿着一个环去跳
如果一个环合法,那么这个环需要满足环上每个点,以及根节点到第一个接触到环的路径上的每个点,都合法
找合法环的过程中,可以用类似于tarjan边双的方法,用两个数组记录那些点被访问过,以及那些点在栈中
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NN 30010
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define inf 0x3f3f3f3f
#define idx(x) (x-'0')
using namespace std; int n;
char str[NN];
int head[NN],nt[NN],vis[NN],use[NN],cte;
struct Edge{int to,nxt;}edge[NN*];
void ae(int u,int v){
cte++;edge[cte].nxt=head[u];
edge[cte].to=v,head[u]=cte;
}
struct AC{
int fail[NN],g[NN],ch[NN][],ed[NN],tot;
void Build_Trie(char *a,int len)
{
int x=;
for(int i=;i<=len;i++){
if(!ch[x][idx(a[i])])
ch[x][idx(a[i])]=++tot;
x=ch[x][idx(a[i])];
}ed[x]=;
}
void Build_Fail()
{
queue<int>q;
if(ch[][]) q.push(ch[][]);
if(ch[][]) q.push(ch[][]);
while(!q.empty())
{
int x=q.front();q.pop();
ae(fail[x],x);
for(int i=;i<;i++){
if(ch[x][i]){
fail[ch[x][i]]=ch[fail[x]][i];
q.push(ch[x][i]);
}else{
ch[x][i]=ch[fail[x]][i];
}
}
}
q.push();
while(!q.empty())
{
int x=q.front();q.pop();
for(int j=head[x];j;j=edge[j].nxt){
int v=edge[j].to;
if(ed[v]||g[x]) g[v]=;
q.push(v);
}
}
}
int find_cir(int x)
{
if(vis[x]) return ;
vis[x]=,use[x]=;
int ans=;
for(int i=;i<;i++){
if(use[ch[x][i]]) return ;
if(!g[ch[x][i]])
ans=find_cir(ch[x][i]);
if(ans) return ;
}use[x]=;return ;
}
void solve()
{
for(int i=;i<=n;i++){
scanf("%s",str+);
int len=strlen(str+);
Build_Trie(str,len);
}Build_Fail();
int ans=;
ans=find_cir(ch[][]);
if(ans){printf("TAK\n");return;}
memset(vis,,sizeof(vis));
ans=find_cir(ch[][]);
if(ans){printf("TAK\n");return;}
printf("NIE\n");
}
}ac; int main()
{
//freopen("t2.in","r",stdin);
scanf("%d",&n);
ac.solve();
return ;
}
BZOJ 2938 [POI2000]病毒 (剪枝/A*迭代搜索)的更多相关文章
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...
- 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.2938.[POI2000]病毒(AC自动机)
题目链接 \(Description\) 给n个模式串,问是否存在长度无限的主串,使得任何一个模式串都没有在主串中出现. \(Solution\) 先建AC自动机. 假设我们有了一个无限长的安全代码, ...
- 【BZOJ】2938: [Poi2000]病毒
题意 \(n\)个01病毒串,总长不超过\(30000\).问是否存在无限长的不包含病毒串的01串. 分析 考虑ac自动机,如果不包含病毒串而且无限长也就是说存在一个环(转移和fail树),使得环上不 ...
- 【BZOJ】2938 [POI2000]病毒(AC自动机)
题目 传送门:QWQ 传送到洛谷QWQ 分析 夏爷爷传送门 代码 #include <bits/stdc++.h> using namespace std; ; ][], fail[N*] ...
- 2938: [Poi2000]病毒
Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...
- BZOJ2938: [Poi2000]病毒(AC自动机)
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1678 Solved: 849[Submit][Status][D ...
- 洛谷 P2444 [POI2000]病毒 解题报告
P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...
随机推荐
- MySQL查询结果保存到本地
#!/bin/bash mysql -h<公网IP> -P<端口号> -u<用户名> -p<密码> -D<指定数据库> >/Users ...
- CF859C Pie Rules 动态规划 逆推_思维题
题意:有 nnn 个物品,每个物品有不同的价值,物品按顺序分给两个人,有一块令牌,每回合拥有令牌的人拥有物品的分配权,但是该回合未获得物品的那个人会在下回合获得令牌,开始令牌在Bob手里,两个人都采取 ...
- springcloud关键词解释和基础代码
原文来自某位大神(不诉薄凉),感觉很好,分享出来. SpringCloud微服务框架搭建 一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么 ...
- 在centos系统中增、删交换分区
Swap介绍: Linux 将物理内存分为内存段,叫做页面.交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放对于页面的内存.物理内存和交换空间的总大小是可用的虚拟内存的总 ...
- python中return和print的区别(详细)
huskiesir最近在研究python哈,今天纠结一个问题,那就是return和print的区别,都是可以输出结果的,到底有啥区别呀?二话不多说,看下面的例子. #代码1: def break_wo ...
- keepalived 和 heartbeat对比
Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP): Heartbeat是基于主机或网络的服务的高可用 ...
- Redis-server在windows下闪退
在win7下使用Redis(windows版)很简单,只需要去Git上下载一个压缩包,解压运行即可.但是前段时间发现win10下双击redis-server既然闪退.非常不解... 在观察了错误日志才 ...
- Linux配置nignx虚拟主机
Nginx 是一个轻量级高性能的 Web 服务器, 并发处理能力强, 对资源消耗小, 无论是静态服务器还是小网站, Nginx 表现更加出色, 作为 Apache 的补充和替代使用率越来越高. 我在& ...
- POJ 2888
思路挺清晰的.不过,我就是WA.不清楚为什么,很多数据都过了. 其实,一个置换后若有循环节个数为K,则N必定可以除以尽K.而K正好可以看成一个环.为什么呢?看前K个珠子,就是一个环,而后面的若干个K个 ...
- Android UI布局之TableLayout
从字面上了解TableLayout是一种表格式的布局.这样的布局会把包括的元素以行和列的形式进行排列.表格的列数为每一行的最大列数.当然表格里边的单元格是能够为空的. 实例:LayoutDemo 执行 ...