• [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");
    }
    
  • 相关阅读:
    字典或者数组与JSON串之间的转换
    银联支付 支付代码
    iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;
    iOS 直接使用16进制颜色
    iOS 添加view的分类(更加方便的设置view的位置)
    iOS 中UITableView的深理解
    Swift 中调试状态下打印日志
    手把手教React Native实战开发视频教程【更新到40集啦。。。】
    React Native 开发
    React-Native学习指南
  • 原文地址:https://www.cnblogs.com/dixiao/p/14243391.html
Copyright © 2020-2023  润新知