hdu 2896 病毒侵襲 (AC自動機)
阿新 • • 發佈:2020-12-25
題目連結: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\n", 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("\n"); } ans.clear(); } printf("total: %d\n", cnt); return 0; }