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;
}
原文地址:https://www.cnblogs.com/tuchen/p/14190689.html