\(Ac\)自动机好题了

这个题要求我们一直无法匹配到结束标记,所以我们直接在\(trie\)图上找到一个环,这个环可以被根节点到达,之后还没有结束标记

发现自己不会\(dfs\)找环,于是直接莽上\(tarjan\)

之后一直写挂各种\(sb\)

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define re register
#define LL long long
#define maxn 30005
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
struct E{int v,nxt;}e[maxn<<4];
int head[maxn];
int n,m,cnt,top,tot,p,num,mid;
char S[maxn];
int son[maxn][2],fail[maxn],flag[maxn];
int dfn[maxn],low[maxn],f[maxn],st[maxn],col[maxn],d[maxn],vis[maxn];
inline void ins()
{
scanf("%s",S+1);
int len=strlen(S+1),now=0;
for(re int i=1;i<=len;i++)
{if(!son[now][S[i]-'0']) son[now][S[i]-'0']=++cnt;now=son[now][S[i]-'0'];}
flag[now]=1;
}
inline void Build()
{
std::queue<int> q;
for(re int i=0;i<2;i++) if(son[0][i]) q.push(son[0][i]);
while(!q.empty())
{
int k=q.front();q.pop();
flag[k]|=flag[fail[k]];
for(re int i=0;i<2;i++)
if(son[k][i]) fail[son[k][i]]=son[fail[k]][i],q.push(son[k][i]);
else son[k][i]=son[fail[k]][i];
}
}
void tarjan(int x)
{
if(flag[x]) return;
f[x]=1,st[++top]=x,dfn[x]=low[x]=++tot;
for(re int i=0;i<2;i++)
{
if(flag[son[x][i]]) continue;
if(!dfn[son[x][i]]) tarjan(son[x][i]),low[x]=min(low[x],low[son[x][i]]);
else if(f[son[x][i]]) low[x]=min(low[x],dfn[son[x][i]]);
}
if(dfn[x]==low[x])
{
++p;int t=0;
do {mid=st[top--];f[mid]=0,t++,col[mid]=p;}while(x!=mid);
d[p]=t;
}
}
inline void add_edge(int x,int y){e[++num].v=y,e[num].nxt=head[x],head[x]=num;}
int dfs(int x)
{
if(d[x]>1) return 1;
int ff=0;
vis[x]=1;
for(re int i=head[x];i;i=e[i].nxt)
if(!vis[e[i].v]) ff|=dfs(e[i].v);
return ff;
}
int main()
{
scanf("%d",&n);
for(re int i=1;i<=n;i++) ins();Build();
for(re int i=0;i<=cnt;i++) if(!dfn[i]) tarjan(i);
for(re int i=0;i<=cnt;i++)
for(re int j=0;j<2;j++) if(col[son[i][j]]!=col[i]) add_edge(col[i],col[son[i][j]]);
for(re int i=0;i<=cnt;i++)
for(re int j=0;j<2;j++)
if(son[i][j]==i) d[col[i]]++;
vis[0]=1;
if(dfs(col[0])) puts("TAK");else puts("NIE");
return 0;
}

【[POI2000]病毒】的更多相关文章

  1. BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]

    2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...

  2. BZOJ_2938_[Poi2000]病毒_AC自动机

    BZOJ_2938_[Poi2000]病毒_AC自动机 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们 ...

  3. P2444 [POI2000]病毒

    P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...

  4. BZOJ 2938: [Poi2000]病毒

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 360[Submit][Status][Di ...

  5. [洛谷P2444] [POI2000]病毒

    洛谷题目链接:[POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会 ...

  6. [POI2000]病毒 --- AC自动机

    [POI2000]病毒 题目描述: 二进制病毒审查委员会最近发现了如下的规律: 某些确定的二进制串是病毒的代码. 如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的. 现在委员会已经找 ...

  7. 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS

    [BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...

  8. BZOJ2938: [Poi2000]病毒(AC自动机)

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1678  Solved: 849[Submit][Status][D ...

  9. 洛谷 P2444 [POI2000]病毒 解题报告

    P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...

  10. BZOJ2938 [Poi2000]病毒 和 BZOJ5261 Rhyme

    [Poi2000]病毒 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码 ...

随机推荐

  1. QWebView使用

      问题: 开始编译的时候在pro文件中要加上 QT += core gui webkitwidgets 文件使用部分加上 #include<QtWebKitWidgets/QWebView&g ...

  2. encoding specified in XML prolog (UTF-8) is different from that specified in page directive (utf-8)

    myeclipse下启动项目后出现错误:encoding specified in XML prolog (UTF-8) is different from that specified in pag ...

  3. (转)SSH服务详解

    SSH服务详解 原文:http://www.cnblogs.com/clsn/p/7711494.html 第1章 SSH服务1.1 SSH服务协议说明SSH 是 Secure Shell Proto ...

  4. (转)第二十三节 inotify事件监控工具

    第二十三节 inotify事件监控工具 标签(空格分隔): Linux实战教学笔记-陈思齐 原文:http://www.cnblogs.com/chensiqiqi/p/6542268.html 第1 ...

  5. 详细讲解Android的网络通信(HttpUrlConnection和HttpClient)

    前言,Android的网络通信的方式有两种:使用Socket或者HTTP,今天这一篇我们详细讲解使用HTTP实现的网络通信,HTTP又包括两种方式编程方式: (1)HttpUrlConnection: ...

  6. 阿里云服务器对外开放tomcat端口访问

    今天第一次在阿里云服务器ecs上安装完成tomcat,然后启动tomcat之后.在本地输入ip:端口,发现不能访问. 出现这个的原因可能是你购买的服务器是 专有网络 类型的 如果是专有网络类型的服务器 ...

  7. unity消息队列

    解决一些当一些消息事件需要处理时,但是 相应的系统还没有初始化来解决的问题 每个系统执行层也有一个消息队列,这样系统没有做好初始化,不执行就好了. 参考:http://blog.csdn.net/ws ...

  8. 资料收集:学习 Linux/*BSD/Unix 的 30 个最佳在线文档

    文章转自:https://linux.cn/article-10311-1.html 手册页(man)是由系统管理员和 IT 技术开发人员写的,更多的是为了作为参考而不是教你如何使用.手册页对于已经熟 ...

  9. python网络编程——简单例子

    客户端(client.py) import socket import sys port = 70 host = sys.argv[1] filename = sys.argv[2] s = sock ...

  10. 使用setInterval函数改变网页背景的颜色

    var icolor=0; var iNum=256; var iID=setInterval(setbgColor, 500); function setbgColor() { body.backg ...