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;
    }
    
  • 相关阅读:
    python爬虫出现的状态码
    FreeSWITCH部署与功能配置
    爬虫读取内容常见的3种方式
    python:3种爬虫的优缺点
    JSON数据解析
    FreeSWITCH与FreeSWITCH对接
    FreeSWITCH添加中文语音
    异步加载技术与逆向工程概念
    word页眉与页脚详解
    修改MyEclipse内存
  • 原文地址:https://www.cnblogs.com/tuchen/p/14190689.html
Copyright © 2011-2022 走看看