[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"); }
相关文章推荐
- bzoj2938 [POI2000]病毒(ACAM+拓扑序判环)
- 【bzoj2938】[Poi2000]病毒 AC自动机
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
- [bzoj2938][Poi2000]病毒 AC自动机
- [BZOJ2938][Poi2000]病毒(AC自动机+拓扑排序)
- 【BZOJ】【2938】【POI2000】病毒
- bzoj2938 [Poi2000]病毒
- BZOJ 2938 [Poi2000]病毒(AC自动机)
- 【BZOJ2938】病毒(POI2000)-AC自动机+DFS判环
- 【bzoj2938】[Poi2000]病毒 trie图+dfs
- 【bzoj2938】[Poi2000]病毒 AC自动机
- [bzoj2938] [Poi2000]病毒
- BZOJ_2938_[Poi2000]病毒_AC自动机
- BZOJ2938 POI2000 病毒 补全AC自动机 Trie图判环
- BZOJ 2938 [Poi2000]病毒
- bzoj2938 [Poi2000]病毒
- [BZOJ 2938][Poi2000]病毒
- BZOJ 2938 Poi2000 病毒 AC自动机+拓扑排序
- [bzoj2938][Poi2000]病毒_AC自动机
- bzoj 2938 [Poi2000]病毒