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

    (2021的第一篇博客,当鸽子好久了,开始沉淀

    题意

    给定一些(01)串,问是否存在一个任意长的(01)串不包含所给的任意一个(01)

    想法

    因为有多个文本串,所以明显考虑(AC自动机),不同的是这次是要我们来找原串,我们可以发现将(trie)树进行(fail)边匹配的时候
    其实是把树扩展了图。
    如果存在这样一个原串 可以不包含任意一个串 那我们来想一下他在自动机上要怎么匹配
    显然是会一直匹配下去,形成一个环!
    所以我们在(trie)图上找环即可,注意当一个点的(fail)边所对应的节点是结束节点的话,要把这个点也认为是结束节点

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define ll long long
    
    ll n,cnt;
    
    using std::queue;
    
    char num[30005];
    
    ll trie[40000][5],fail[40000];
    
    bool end[40000];
    
    void insert(){
    	ll now = 0;
    	ll len = strlen(num + 1);
    	for(int i = 1;i <= len;++i){
    		if(!trie[now][num[i] - '0'])
    		++cnt,trie[now][num[i] - '0'] = cnt;;
    		now = trie[now][num[i] - '0'];
    	}
    	end[now] = 1;
    }
    
    queue<int>QWQ;
    
    void get_fail(){
    	for(int i = 0;i <= 1;++i)
    	if(trie[0][i]) fail[trie[0][i]] = 0,QWQ.push(trie[0][i]);
    	while(!QWQ.empty()){
    		int u = QWQ.front();QWQ.pop();
    		for(int i = 0;i <= 1;++i){
    		if(trie[u][i]) fail[trie[u][i]] = trie[fail[u]][i],QWQ.push(trie[u][i]);
    		else trie[u][i] = trie[fail[u]][i];
    		if(end[trie[fail[u]][i]])
    		end[trie[u][i]] = 1;
    		}
    	}
    }
    
    bool ins[40000],used[40000];
    
    bool get(ll now){
    	ins[now] = 1;
    	for(int i = 0;i < 2;++i){
    		int v = trie[now][i];
    		if(ins[v]) return 1;
    		if(used[v] || end[v]) continue;
    		used[v] = 1;
    		if(get(v)) return 1;
    	}
    	ins[now] = 0;
    	return 0;
    } 
    
    int main(){
    	scanf("%lld",&n);
    	for(int i = 1;i <= n;++i){
    		scanf("%s",num + 1);
    		insert();
    	}
    	get_fail();	
    	if(get(0))
    	puts("TAK");
    	else
    	puts("NIE");
    }
    
  • 相关阅读:
    MongoDB中常用的find
    MongoDB文档的增删改操作
    我的notepad++
    MongoDB入门知识
    Python基础5-常用模块
    Python基础4
    Python基础3(2017-07-20)
    Python基础2(2017-07-18)
    Python基础1(2017-07-16)
    Python简介(2017-07-16)
  • 原文地址:https://www.cnblogs.com/dixiao/p/14243391.html
Copyright © 2011-2022 走看看