博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2938:[Poi2000]病毒
阅读量:4945 次
发布时间:2019-06-11

本文共 1667 字,大约阅读时间需要 5 分钟。

考虑AC自动机匹配的过程

如果下一个节点是危险节点,我们就不跳到这个节点

如果下一个节点的 fail 是危险节点,我们也不跳到这个节点

这个标记在 getfail 的时候就可以打上

这样只要匹配的过程中能构成一个循环即可

非常的妙啊

#include
#include
#include
#include
#include
#include
#include
using namespace std;const int MAXN = 1000005;struct Node{ int fail, nxt[2], lst; bool end; Node(){fail = lst = 0; memset(nxt, 0, sizeof(nxt));end = false;}}t[MAXN];int n, Root = 0, ptr = 0;char str[MAXN];bool getans = false, inque[MAXN], vis[MAXN];queue
q;inline int newnode() { return ++ptr;}inline void Insert(char *s) { int len = strlen(s), cur = Root; for(int i = 0; i < len; ++i) { register int x = s[i] - '0'; if(!t[cur].nxt[x]) t[cur].nxt[x] = newnode(); cur = t[cur].nxt[x]; } t[cur].end = true; return;}inline void getfail() { t[Root].fail = 0; for(int i = 0; i < 2; ++i) if(t[Root].nxt[i]) q.push(t[Root].nxt[i]); while(!q.empty()) { int cur = q.front(); q.pop(); for(int i = 0; i < 2; ++i) { register int son = t[cur].nxt[i], fail = t[cur].fail; if(!son) { t[cur].nxt[i] = t[fail].nxt[i]; continue; } t[son].fail = t[fail].nxt[i]; t[son].end |= t[t[son].fail].end; q.push(son); } } return;}void dfs(int cur) { if(getans) return; inque[cur] = true; for(int i = 0; i < 2; ++i) { int son = t[cur].nxt[i]; if(inque[son]) { getans = true; break; } if(t[son].end || vis[son]) continue; vis[son] = true; dfs(son); } inque[cur] = false; return;}int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) { scanf("%s", str); Insert(str); } getfail(); dfs(Root); if(getans) puts("TAK"); else puts("NIE"); return 0;}

 

转载于:https://www.cnblogs.com/xcysblog/p/9314803.html

你可能感兴趣的文章
ORA-3136
查看>>
算法笔记_145:拓扑排序的应用(Java)
查看>>
JS获取农历日期
查看>>
PHP中的HTTP协议
查看>>
CSS给文字描边实现发光文字
查看>>
Java WebService入门实例
查看>>
css样式之补充
查看>>
结构与联合
查看>>
BUPT复试专题—众数(2014)
查看>>
20145316 《信息安全系统设计基础》第十四周学习总结
查看>>
Liferay7 BPM门户开发之18: 理解ServiceContext
查看>>
Intel Galileo development documentation
查看>>
EV: Workaround to Allow Only One Instance or Window of outlook
查看>>
数据校验,
查看>>
IntelliJ IDEA完美解决tomcat8+乱码问题
查看>>
破解电信光猫华为HG8120C关闭路由功能方法
查看>>
在Qt示例项目的C ++ / QML源中的//! [0]的含义是什么?
查看>>
【智能家居篇】wifi网络接入原理(上)——扫描Scanning
查看>>
操作引入xml文件的书包(定位到指定节点)
查看>>
操作系统学习笔记系列(一)- 导论
查看>>