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

    Description

    二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。
    示例:
    例如如果{ (011), (11), (00000) }为病毒代码段,那么一个可能的无限长安全代码就是 (010101) …。如果{ (01), (11), (000000) }为病毒代码段,那么就不存在一个无限长的安全代码。
    任务:
    请写一个程序:

    • 读入病毒代码;
    • 判断是否存在一个无限长的安全代码;
    • 将结果输出

    Input

    第一行包括一个整数 (n) ,表示病毒代码段的数目。以下的 (n) 行每一行都包括一个非空的 (01) 字符串——就是一个病毒代码段。所有病毒代码段的总长度不超过 (30000)

    Output

    你应在在文本文件 (WIN.OUT) 的第一行输出一个单词:

    • (TAK) ——假如存在这样的代码;
    • (NIE) ——如果不存在。

    Sample Input

    3
    01
    11
    00000

    Sample Output

    NIE

    Solution

    一个无限长的合法串,就会在ac自动机上跑成一个环,且不会进入 (danger) 节点。详见代码。

    #include<bits/stdc++.h>
    using namespace std;
    
    #define N 1000001
    #define rep(i, a, b) for (int i = a; i <= b; i++)
    
    struct acDFAType {
    	int ch[N][2], fail[N], tot;
    	bool danger[N], inStk[N], vis[N];
    	char s[N];
    	void insert() {
    		scanf("%s", s); int u = 0, len = strlen(s);
        	rep(i, 0, len - 1) {
            	if(!ch[u][s[i] - '0']) ch[u][s[i] - '0'] = ++tot;
            	u = ch[u][s[i] - '0'];
    		}
        	danger[u] = 1;
    	}
    	void getFail() {
    		register queue<int> q; rep(i, 0, 1) if(ch[0][i]) q.push(ch[0][i]);
    		while(!q.empty()) {
    			int u = q.front(); q.pop();
    			rep(i, 0, 1) {
    				int v = ch[u][i]; if(!v) { ch[u][i] = ch[fail[u]][i]; continue; } q.push(v);
    				int tmp = fail[u]; while(tmp && !ch[tmp][i]) tmp = fail[tmp];
    				fail[v] = ch[tmp][i]; danger[v] |= danger[fail[v]];
    			}
    		}
    	}
    	bool dfs(int u) {
    		inStk[u] = 1;
    		rep(i, 0, 1) {
    			int v = ch[u][i]; if(inStk[v]) return 1; if(danger[v] || vis[v]) continue; vis[v] = 1;
    			if(dfs(v)) return 1;
    		}
    		return inStk[u] = 0;
    	}
    }acm;
    
    int main() {
        int n; cin >> n; while(n--) acm.insert(); acm.getFail(); puts(acm.dfs(0) ? "TAK" : "NIE");
        return 0;
    }
    
  • 相关阅读:
    TCP拥塞控制机制
    C/S 与 B/S 区别
    ext4文件系统新特性
    关于TCP慢启动和拥塞避免的题
    [信息图表]移动学习 Go Study
    [时间线]Android市场的发展
    学习,只有勤奋是不够的……
    UNIX域套接字实例
    程序员的本质
    淘宝Web服务器Tengine正式开源
  • 原文地址:https://www.cnblogs.com/aziint/p/8416253.html
Copyright © 2011-2022 走看看