您的位置:首页 > 其它

[bzoj2938][Poi2000]病毒

2018-01-09 20:21 489 查看
Orz w_yqts trie图dalao

建完自动机判断是否能跑出环(不能经过有价值的点或后缀)

#include <bits/stdc++.h>
using namespace std;
#define N 66666
char s
;
int trie
[2],point
,tottrie;
int danger
,instk
;
int q
,vis
;
void init()
{
scanf("%s",s);
int len=strlen(s);
int now=0;
for (int i=0;i<len;++i)
{
int t=s[i]-'0';
if (trie[now][t]) now=trie[now][t];else now=trie[now][t]=++tottrie;
}
danger[now]=1;
}
void AC()
{
int st=0,ed=1;
q[1]=0;
while (st<ed)
{
int now=q[++st];
for (int i=0;i<2;++i)
{
if (trie[now][i]) point[trie[now][i]]=(now==0)?0:trie[point[now]][i],q[++ed]=trie[now][i],danger[trie[now][i]]|=danger[trie[point[now]][i]];
else trie[now][i]=trie[point[now]][i];
}
}
}
int Orzwyqts=0;
void dfs(int x)
{
vis[x]=1;
instk[x]=1;
if (Orzwyqts) return;
for (int i=0;i<2;++i)
if (!danger[trie[x][i]])
{
if (instk[trie[x][i]]) {Orzwyqts=1;return;}
if (vis[trie[x][i]]) continue;
if (Orzwyqts) return;
dfs(trie[x][i]);
if (Orzwyqts) return;
}
if (Orzwyqts) return;
instk[x]=0;
}
int main()
{
int m;
cin>>m;
while (m--) init();
AC();
dfs(0);
if (Orzwyqts) puts("TAK");else puts("NIE");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: