zoukankan      html  css  js  c++  java
  • 【Luogu2444】病毒(AC自动机)

    【Luogu2444】病毒(AC自动机)

    题面

    洛谷

    题解

    如果存在一个无限长的串
    证明可以在(AC)自动机上找到一个环
    然后在上面可以无限跳

    所以构建(AC)自动机
    在上面跑(dfs)就好啦

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define MAX 50000
    struct Node
    {
        int vis[2];
        int fail,lt;
    }t[MAX];
    int n,tot;
    char ch[MAX];
    void insert(char *s)
    {
        int l=strlen(s+1),now=0;
        for(int i=1;i<=l;++i)
        {
            if(!t[now].vis[s[i]-48])
                t[now].vis[s[i]-48]=++tot;
            now=t[now].vis[s[i]-48];
        }
        t[now].lt=1;
    }
    void Getfail()
    {
        queue<int> Q;
        for(int i=0;i<2;++i)
            if(t[0].vis[i])Q.push(t[0].vis[i]);
        while(!Q.empty())
        {
            int u=Q.front();Q.pop();
            t[u].lt|=t[t[u].fail].lt;
            for(int i=0;i<2;++i)
                if(t[u].vis[i])
                    t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]);
                else t[u].vis[i]=t[t[u].fail].vis[i]; 
        }
    }
    bool vis[MAX];
    bool vv[MAX];
    void DFS(int u)
    {
        if(t[u].lt)return;
    	if(vis[u]){puts("TAK");exit(0);}
    	if(vv[u])return;
    	vis[u]=true;vv[u]=true;
        for(int i=0;i<2;++i)
    		if(t[u].vis[i])
    			DFS(t[u].vis[i]);
    	vis[u]=false;
    }
    int main()
    {
        scanf("%d",&n);
        while(n--)
        {
            scanf("%s",ch+1);
            insert(ch);
        }
        Getfail();
        DFS(0);
        puts("NIE");
        return 0;
    }
    
    
  • 相关阅读:
    战胜忧虑<2>——忙碌可以消除忧虑
    战胜忧虑<1>——不要让忧郁侵入你的生活
    Django的下载和安装
    Github 如何上传本地文件
    Python_相对路径的获取
    Python_生成HTMLTestRunner测试报告
    Python_requests实例
    Charles抓包(Http/Https请求)
    Python_base_函数返回值
    Python_base_print 取消自动换行
  • 原文地址:https://www.cnblogs.com/cjyyb/p/8333831.html
Copyright © 2011-2022 走看看