bzoj 2938 病毒 AC自动机
来源:互联网 发布:淘宝旗舰店假货 编辑:程序博客网 时间:2024/05/22 10:29
在补全之后的AC自动机上顺着child找环而不经过终止节点,如果存在环,则说明我们可以顺着这条路径构造无限长的字符串。
#include<queue>#include<cstdio>#include<cstring>#include<iostream>#define maxn 100005using namespace std;char s[maxn];struct Trie{ bool val[maxn]; int fail[maxn]; int ch[maxn][2],cnt; void insert() { int p=0; int n=strlen(s+1); for(int i=1;i<=n;i++) { int c=s[i]-'0'; if(!ch[p][c]) ch[p][c]=++cnt; p=ch[p][c]; } val[p]=1; } queue<int> Q; void build() { for(int i=0;i<=1;i++) if(ch[0][i]) Q.push(ch[0][i]); while(!Q.empty()) { int r=Q.front();Q.pop(); for(int i=0;i<=1;i++) { int u=ch[r][i]; if(!u) { ch[r][i]=ch[fail[r]][i]; continue; } Q.push(u); int p=fail[r]; while(p&&!ch[p][i]) p=fail[p]; fail[u]=ch[p][i]; val[u]|=val[fail[u]]; } } } bool ins[maxn]; bool vis[maxn]; bool dfs(int x) { bool can=0; ins[x]=vis[x]=1; for(int i=0;i<=1;i++) { int v=ch[x][i]; if(!val[v]) { if(vis[v])return true; if(!ins[v]&&dfs(v))return true; } } vis[x]=0; return false; }}AC;int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s+1); AC.insert(); } AC.build(); if(AC.dfs(0)) puts("TAK"); else puts("NIE"); return 0;}
1 0
- bzoj 2938 病毒 AC自动机
- BZOJ 2938 病毒 AC自动机
- 【AC自动机】【bzoj 2938】: [Poi2000]病毒
- BZOJ 2938: [Poi2000]病毒 AC自动机
- bzoj 2938: [Poi2000]病毒 AC自动机
- BZOJ 2938: [Poi2000]病毒 AC自动机
- bzoj 2938: [Poi2000]病毒(AC自动机)
- BZOJ 2938 Poi2000 病毒 AC自动机+拓扑排序
- 【BZOJ】【P2938】【Poi2000】【病毒】【题解】【AC自动机】
- BZOJ 2938 | AOJ 844 AC自动机 + dfs
- bzoj 2938(AC自动机+拓扑排序)
- bzoj 3172(AC自动机)
- BZOJ 3172 AC自动机
- BZOJ 3940 AC自动机
- 【AC自动机】 hdu2896 病毒侵袭
- 【hdu2896】【AC自动机】病毒侵袭
- HDU2896(病毒侵袭--AC自动机)
- HDU2896 病毒侵袭 AC自动机
- Opencv中灰度图像和imread的区别
- 一刻钟精通正则表达式
- win10安装与破解loadrunner一系列问题
- linux进程状态浅析
- 【洛谷P3694】邦邦的大合唱站队/签到题
- bzoj 2938 病毒 AC自动机
- Hbase伪分布式搭建
- 数据库的认识
- 回忆
- 进程和线程的概念
- phpexcel 遇到的一些问题
- 面试题2之翻转一个给定的字符串
- Linux第十单元练习题
- 阿里云ECS CentOS lamp搭建及绑定多个网站