bzoj2938 [Poi2000]病毒(AC自动机+DFS找环)
2018-02-05 16:54
495 查看
bzoj2938 [Poi2000]病毒
原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2938题意:
二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。
示例:
例如如果{011, 11, 00000}为病毒代码段,那么一个可能的无限长安全代码就是010101…。如果{01, 11, 000000}为病毒代码段,那么就不存在一个无限长的安全代码。
任务:
请写一个程序:
l 读入病毒代码;
l 判断是否存在一个无限长的安全代码;
l 将结果输出
数据范围
所有病毒代码段的总长度不超过30000。
题解:
无限长的安全串,即 在不走单词结尾节点的情况下,能够无限地转移下去。
就是说,对于补全AC自动机,存在不包含单词结尾节点的环。
建出补全AC自动机, DFS找环即可。
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=30005; int ch [2],fail ,isw ,tail=0,root=0,n; bool vis ,flag=0,ins ; char s ; queue<int> Q; void insert() { int len=strlen(s); int tmp=root; for(int i=0;i<len;i++) { int c=s[i]-'0'; if(!ch[tmp][c]) ch[tmp][c]=++tail; tmp=ch[tmp][c]; } isw[tmp]=1; } void getfail() { for(int i=0;i<2;i++) if(ch[root][i]) Q.push(ch[root][i]); while(!Q.empty()) { int top=Q.front(); Q.pop(); for(int i=0;i<2;i++) { if(!ch[top][i]) ch[top][i]=ch[fail[top]][i]; else { int u=ch[top][i]; fail[u]=ch[fail[top]][i]; isw[u]|=isw[fail[u]]; Q.push(u); } } } } void dfs(int u) { vis[u]=1; ins[u]=1; for(int i=0;i<2;i++) { int v=ch[u][i]; if(isw[v]) continue; if(ins[v]) {flag=1;return;} if(!vis[v]) dfs(v); } ins[u]=0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) {scanf("%s",s); insert();} getfail(); dfs(root); if(flag) printf("TAK\n"); else printf("NIE\n"); return 0; }
相关文章推荐
- [BZOJ2938][POI2000]病毒(AC自动机+dfs)
- Hnu 10104 病毒 (AC自动机+dfs)
- BZOJ2938 [Poi2000]病毒 解题报告【AC自动机】【DFS】
- HDU 2896 病毒传播 AC 自动机 蛮裸的。。
- bzoj2938 [Poi2000]病毒 AC自动机+DP
- BZOJ2938 [Poi2000]病毒 【AC自动机】
- CodeForces 547E:Mike and Friends(AC自动机+DFS序+主席树)
- HDU 3065 AC 自动机再来。。 病毒持续侵袭中
- [HDU3065]病毒持续侵袭中(AC自动机)
- [HDU3065]病毒持续侵袭中(AC自动机+fail树)
- 病毒的侵扰和再侵扰两道AC自动机的应用
- 【HDU2896】病毒侵袭——ac自动机
- bzoj2938【Poi2000】病毒
- BZOJ2938[Poi2000]病毒 AC自动机
- 病毒持续侵入(AC自动机)
- bzoj2938(ac自动机)
- zoj 1540 Censored! AC自动机+DP 长度为len的字符串不包含病毒串的个数
- [HDU3065]病毒持续侵袭中(AC自动机)
- bzoj2938【Poi2000】病毒
- bzoj2938[Poi2000]病毒 AC自动机+dfs