zoukankan      html  css  js  c++  java
  • 题解 [POI2000]病毒

    题意:给出(n)(01)串,求是否存在一个无限长的(01)串,使得这(n)(01)串都不是这个无限长的(01)串的子串。

    我们给(n)(01)串建出 AC 自动机,给每个(01)串的结尾节点打上标记,代表这个点表示的字符串不能出现在构造出的串中。同时如果一个点得(fail)指针带有标记,那么他自己一定也不能出现,我们给他也打上标记。问题就等价于在(Trie)图中是否存在一个环,环上的每个节点都没有标记。直接(dfs)即可。

    代码

    #pragma GCC optimize(2)
    #include<bits/stdc++.h>
    #include<tr1/unordered_map>
    #define re register
    #define N 30001
    #define MAX 2001
    #define inf 1e18
    #define eps 1e-10 
    using namespace std;
    typedef unsigned long long ll;
    typedef double db;
    inline void read(re ll &ret)
    {
        ret=0;re ll pd=0;re char c=getchar();
        while(!isdigit(c)){pd|=c=='-';c=getchar();}
        while(isdigit(c)){ret=(ret<<1)+(ret<<3)+(c&15);c=getchar();}
        ret=pd?-ret:ret;
        return;
    }
    ll n,trie[N][2],tot,f[N],nxt[N];
    char s[N];
    inline void insert()
    {
    	re ll p=0,len=strlen(s+1);
    	for(re int i=1;i<=len;i++)
    	{
    		re ll c=(s[i]&15);
    		if(!trie[p][c])
    			trie[p][c]=++tot;
    		p=trie[p][c];
    	}
    	f[p]=true;
    	return;
    }
    inline void bfs()
    {
    	queue<ll>q;
    	if(trie[0][0])
    		q.push(trie[0][0]);
    	if(trie[0][1])
    		q.push(trie[0][1]);
    	while(!q.empty())
    	{
    		re ll p=q.front();
    		q.pop();
    		for(re int i=0;i<2;i++)
    		{
    			if(!trie[p][i])
    				trie[p][i]=trie[nxt[p]][i];
    			else
    			{
    				nxt[trie[p][i]]=trie[nxt[p]][i];
    				f[trie[p][i]]|=f[nxt[trie[p][i]]];
    				q.push(trie[p][i]);
    			}
    		}
    	}
    	return;
    }
    tr1::unordered_map<ll,bool>vis,vst;
    inline void dfs(re ll deep)
    {
    	if(f[deep])return;
    	if(vis[deep])
    	{
    		puts("TAK");
    		exit(0);
    	}
    	if(vst[deep])
    		return;
    	vis[deep]=true;
    	vst[deep]=true;
    	dfs(trie[deep][0]);
    	dfs(trie[deep][1]);
    	vis[deep]=false;
    }
    signed main()
    {
    	read(n);
    	for(re int i=1;i<=n;i++)
    	{
    		scanf("%s",s+1);
    		insert();
    	}
    	bfs();
    	dfs(0);
    	puts("NIE");
    	exit(0);
    }
    
  • 相关阅读:
    70.BOM
    69.捕获错误try catch
    68.键盘事件
    523. Continuous Subarray Sum
    901. Online Stock Span
    547. Friend Circles
    162. Find Peak Element
    1008. Construct Binary Search Tree from Preorder Traversal
    889. Construct Binary Tree from Preorder and Postorder Traversal
    106. Construct Binary Tree from Inorder and Postorder Traversal
  • 原文地址:https://www.cnblogs.com/CelticBlog/p/13531828.html
Copyright © 2011-2022 走看看