[日常摸鱼][POI2000]病毒-Tire图(AC自动机)+dfs
https://www.luogu.org/problemnew/show/P2444
(没有bzoj权限号T_T)
字符串题对我这种傻逼来说真是太难了x
题意:输入$n$个01组成的模式串串,判断是否存在一个无限长的01串满足任何给定的模式串都不是这个串的子串,$n \leq 2000,\sum len(str) \leq 30000$
首先用模式串构造出AC自动机(其实应该叫Trie图),题目要求的串如果存在,那就相当于在Trie图上存在一个环,这个环不包含任何一个模式串,所以只要构造出来Tire图判断是否存在这样子的环,注意如果Tire图上的某个点$x$是一个模式串的结尾,那么不仅不能够经过$x$,而且不能经过所有包含这个后缀的串,根据$fail$指针的定义就可以直接这样写:
danger[tr[k][i]]|=danger[fail[tr[k][i]]];
完整的代码:
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=30005;
int n,cnt;
int tr[N][2],fail[N];
bool danger[N],vis[N],mark[N],flag;
char s[N];
queue<int>q;
inline void insert(char *c)
{
int len=strlen(c+1),k=0;
for(register int i=1;i<=len;i++)
{
int t=c[i]-'0';
if(!tr[k][t])tr[k][t]=++cnt;
k=tr[k][t];
}danger[k]=1;
} inline void build()
{
if(tr[0][0])fail[tr[0][0]]=0,q.push(tr[0][0]);
if(tr[0][1])fail[tr[0][1]]=0,q.push(tr[0][1]);
while(!q.empty())
{
int k=q.front();q.pop();
for(register int i=0;i<=1;i++)
{
if(!tr[k][i])tr[k][i]=tr[fail[k]][i];
else
{
fail[tr[k][i]]=tr[fail[k]][i];
danger[tr[k][i]]|=danger[fail[tr[k][i]]];//
q.push(tr[k][i]);
}
}
}
} inline int dfs(int x)
{
vis[x]=1;
for(register int i=0;i<=1;i++)
{
int k=tr[x][i];
if(vis[k])return 1;
if(mark[k]||danger[k])continue;
mark[k]=1;
if(dfs(k))return 1;
}
vis[x]=0;return 0;
} int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%s",s+1);insert(s);
}
build();
if(dfs(0))printf("TAK");
else printf("NIE");
return 0;
}
[日常摸鱼][POI2000]病毒-Tire图(AC自动机)+dfs的更多相关文章
- BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...
- BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组
题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小 ...
- [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵
今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- [luoguP2444] [POI2000]病毒(AC自动机 + dfs)
传送门 先把所有串建一个AC自动机, 如果要找一个不包含任意一个串的串, 说明这个串一直在AC自动机上匹配但匹配不到, 也就是说,匹配时除去val值为1的点,除去fail指针指向val值为1的点,是否 ...
- HDU 2896 病毒侵袭(AC自动机水)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- [BZOJ2938]病毒 (AC自动机+dfs)
题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...
- HDU 2896 病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2896 病毒侵袭【AC自动机】
<题目链接> Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一 ...
随机推荐
- 使用Camtasia创作抖音卡点视频
空闲的时候刷一刷抖音相信已经成为很多人的日常啦,抖音里面的视频形式多种多样,而其中的卡点视频更是被大家热烈追捧.如果你外出旅行拍摄了很多好看的照片,就很适合用卡点视频的形式展现出来. 如果你想要制作这 ...
- yii2.0 模态框简单使用
1 <?php foreach($data as $model) :?> 2 3 <!-- 按钮触发模态框 --> 4 <button class="btn b ...
- PC 端轮播图的实现
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- HTML+JavaScript画函数图像
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- eNSP VLAN划分基础配置及Trunk接口
跨交换机实现VLAN通信拓扑图: 一.配置PC机 ip 并测试相互能否ping通 PC名称 IP 子网掩码 网关 PC1 10.1.1.1 255.255.255.0 10.1.1.254 PC2 1 ...
- 在VMware下创建windows server 2008虚拟机
1.创建新的虚拟机 打开VMware软件,点击主页内创建新的虚拟机 2.进入新建虚拟机向导 点击典型,点击下一步 3.在下一步中单击稍后安装操作系统 点击下一步 4.选择操作系统类型 客户机操作系统选 ...
- Springboot结合Jpa的外键使用
当我们写项目的时候,总有些奇奇怪怪的理由,非让你连表查询,其实最好的就是什么都不连,数据库完全解耦 但我们还是要学习下Jpa怎么根据外键查询 (这里说下Jpa+springboot的感觉,刚开始就感觉 ...
- PyQt学习随笔:槽函数获取信号发送对象的方法
在PyQt中,相似控件发送的信号可以每个控件信号对应一个槽函数,也可以将相似控件的相同信号对应到一个槽函数,但如果槽函数相同,怎么区分信号是谁发送的呢?那就是在信号函数中使用sender()函数获取信 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象的toolButtonStyle属性
tooButtonStyle属性保存主窗口工具栏按钮的样式设置,用来表示工具栏按钮的文字和图标怎么显示. 该属性的可设置值类型为枚举类型Qt.ToolButtonStyle,它包含如下值: 该属性的缺 ...
- B站自动爬取器并制作词云
效果 词云展示 弹幕展示 爬取弹幕过程 基本步骤 1.寻找视频url 2.构造请求头 3.寻找弹幕地址 4.根据弹幕地址运用正则或xpath爬取 寻找B站视频的url 制作请求头 headers = ...