【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

*/
View Code

 

 

posted @ 2018-02-08 23:49  noble_(noblex)  阅读(100)  评论(0编辑  收藏  举报
/* */