【bzoj2938】病毒 AC自动机
2016-11-21 13:06
387 查看
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2938
【题解】
AC自动机,然后判环即可。#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<cmath> #include<algorithm> using namespace std; int n,cnt(1),end[30010],size[30010],q[30010],fail[30010],ins[30010],vis[30010],tr[30010][2]; char ch[30010]; inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();} return x*f; } void Insert() { int now=0,l=strlen(ch+1); for(int i=1;i<=l;i++) { if(!tr[now][ch[i]-'0']) tr[now][ch[i]-'0']=++cnt; now=tr[now][ch[i]-'0']; } end[now]=1; } void build() { int head=0,tail=0; for(int i=0;i<=1;i++) if(tr[0][i]) q[++tail]=tr[0][i]; while(++head<=tail) { int x=q[head]; for(int i=0;i<=1;i++) { int y=tr[x][i]; if(!y){tr[x][i]=tr[fail[x]][i];continue;} q[++tail]=y; int temp=fail[x]; while(!tr[temp][i]) temp=fail[temp]; fail[y]=tr[temp][i]; end[y]|=end[tr[temp][i]]; } } } bool dfs(int x) { ins[x]=1; for(int i=0;i<2;i++) { int v=tr[x][i]; if(ins[v])return 1; if(vis[v]||end[v])continue; vis[v]=1; if(dfs(v))return 1; } ins[x]=0; return 0; } int main() { //freopen("cin.in","r",stdin); //freopen("cout.out","w",stdout); n=read(); for(int i=1;i<=n;i++) {scanf("%s",ch+1); Insert();} build(); if(dfs(0)) printf("TAK\n"); else printf("NIE\n"); return 0; }
相关文章推荐
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
- 【AC自动机】【bzoj 2938】: [Poi2000]病毒
- bzoj 2938: [Poi2000]病毒 AC自动机
- bzoj2938 [Poi2000]病毒 ac自动机
- AC自动机【poi2000】bzoj2938 病毒
- 【bzoj2938】[Poi2000]病毒 AC自动机
- [bzoj2938][Poi2000]病毒 AC自动机
- BZOJ 2938: [Poi2000]病毒 AC自动机
- BZOJ 2938 [Poi2000]病毒(AC自动机)
- 【bzoj2938】[Poi2000]病毒 AC自动机
- BZOJ_2938_[Poi2000]病毒_AC自动机
- 【BZOJ2938】病毒,AC自动机练习
- bzoj 2938: [Poi2000]病毒(AC自动机)
- BZOJ2938 POI2000 病毒 补全AC自动机 Trie图判环
- BZOJ 2938: [Poi2000]病毒 AC自动机
- bzoj 2938 病毒 AC自动机
- [bzoj2938][Poi2000]病毒_AC自动机
- 【bzoj 2938】病毒(AC自动机)
- [BZOJ]2938 [POI2000] 病毒 AC自动机
- BZOJ2938 & 洛谷2444:[POI2000]病毒——题解