【BZOJ】2938 [POI2000]病毒(AC自动机)
题目
传送门:QWQ
传送到洛谷QWQ
分析
代码
#include <bits/stdc++.h> using namespace std; const int N=2005; int n, son[N*15][2], fail[N*15], end[N*15], q[N*15], vis[N*15], c[N*15]; char s[N][N*15]; bool cycle(int u) { c[u]=1; for(int i=0;i<=1;i++) { int v=son[u][i]; if(c[v]) return true; if(vis[v] || end[v]) continue; vis[v]=1; if(cycle(v)) return true; } c[u]=0; return false; } int find(int cur,int i) { if(!cur) return 1; if(son[cur][i]) return son[cur][i]; return fail[son[cur][i]]=find(fail[cur],i); } int main() { int newp=1,rt=1; scanf("%d",&n); for(int j=1;j<=n;j++) { scanf("%s",s[j]+1); int cur=rt, l=strlen(s[j]+1); for(int i=1;i<=l;i++) { if(!son[cur][s[j][i]-'0']) son[cur][s[j][i]-'0']=++newp; cur=son[cur][s[j][i]-'0']; } end[cur]=1; } int l=1,r=1; q[1]=1; for(;l<=r;l++) { for(int i=0;i<=1;i++) if(son[q[l]][i]) { int v=son[q[l]][i]; fail[v]=find(fail[q[l]],i); end[v]|=end[fail[v]]; q[++r]=son[q[l]][i]; } else son[q[l]][i]=son[fail[q[l]]][i];//改儿子方便处理 } if(cycle(1)) { printf("TAK\n");} else printf("NIE"); return 0; } /* 3 011 11 00000 */