Luogu2444 [POI2000]病毒
题面: https://www.luogu.org/problemnew/show/P2444
题解: https://www.luogu.org/blog/flashblog/solution-p2444
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+4; int tot=0,vis[maxn],inst[maxn]; struct node{ int fail,next[2],tag,end; }z[maxn]; inline void insert(char *s){ int len=strlen(s); int now=0; for(int i=0;i<len;i++){ int v=s[i]-'0'; if(!z[now].next[v]) z[now].next[v]=++tot; now=z[now].next[v]; } z[now].end=1; } inline void build_AC(){ queue<int>q; for(int i=0;i<2;i++) { z[z[0].next[i]].fail=0; if(z[0].next[i]) q.push(z[0].next[i]); } while(!q.empty()){ int now=q.front();q.pop(); for(int i=0;i<2;i++){ if(z[now].next[i]){ z[z[now].next[i]].fail=z[z[now].fail].next[i]; q.push(z[now].next[i]); z[now].end|=z[z[now].fail].end; }else{ z[now].next[i]=z[z[now].fail].next[i]; } } } } inline void dfs(int u){ if(inst[u]) puts("TAK"),exit(0); if(vis[u]||z[u].end) return; inst[u]=vis[u]=1; dfs(z[u].next[0]); dfs(z[u].next[1]); inst[u]=0; } char s[30004]; int main(){ int n;cin>>n; for(int i=1;i<=n;i++){ scanf("%s",s); insert(s); } build_AC(); dfs(0); puts("NIE"); }