zoukankan      html  css  js  c++  java
  • hdu 2896 病毒侵袭 (AC自动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896

    注意字符集大小。。

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<queue> 
    #include<vector>
    using namespace std;
    typedef long long ll;
    
    const int maxn = 100010;
    
    int n, m, tot = 0, rt = 0;
    vector<int> ans; 
    
    char s[10010];
    
    struct Node{
    	int son[130], fail, id, vis;
    }t[maxn];
    
    void insert(int num){
    	int p = 0;
    	int len = strlen(s);
    	for(int i = 0 ; i < len ; ++i){
    		int c = s[i];
    		if(!t[p].son[c]){
    			t[p].son[c] = ++tot;
    		}
    		p = t[p].son[c];
    	}
    	t[p].id = num;
    }
    
    queue<int> q;
    
    void build(){
    	for(int i = 0 ; i <= 128 ; ++i){
    		if(t[0].son[i]) q.push(t[0].son[i]);
    	}
    	
    	while(!q.empty()){
    		int u = q.front(); q.pop();
    		for(int i = 0 ; i <= 128 ; ++i){
    			if(t[u].son[i]){
    				t[t[u].son[i]].fail = t[t[u].fail].son[i];
    				q.push(t[u].son[i]);
    			} else{
    				t[u].son[i] = t[t[u].fail].son[i];
    			}
    		}
    	}
    }
    
    void query(){
    	int len = strlen(s);
    	int p = 0;
    	for(int i = 0 ; i < len ; ++i){
    		p = t[p].son[s[i]];
    //		printf("%d %d
    ", p, t[p].id); 
    		for(int j = p ; j && !t[j].vis ; j = t[j].fail) {//
    			if(t[j].id) ans.push_back(t[j].id);
    			t[j].vis = 1;
    		}
    	} 
    }
    
    ll read(){ ll s = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * f; }
    
    int main(){
    	n = read();
    	for(int i = 1 ; i <= n ; ++i){
    		scanf("%s", s);
    		insert(i);
    	}
    	
    	build();
    	
    	m = read();
    	int cnt = 0;
    	for(int i = 1 ; i <= m ; ++i){
    		scanf("%s", s);
    		for(int j = 0 ; j <= tot ; ++j) t[j].vis = 0;
    		query();
    	
    		if(ans.size()) {
    			++cnt;
    			printf("web %d:", i);
    			sort(ans.begin(), ans.end());
    			for(int j = 0 ; j < ans.size() ; ++j){
    				printf(" %d", ans[j]);
    			}
    			printf("
    ");
    		}
    		ans.clear();
    	} 
    	printf("total: %d
    ", cnt);
    	
    	return 0;
    }
    
  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/tuchen/p/14190689.html
Copyright © 2011-2022 走看看