HDU 2896 病毒侵袭(ac自动机)
2015-11-29 00:08
393 查看
题意:
求多模式串匹配,并且输出每个母串中出现的模式串编号,以及所有模式串出现的总次数
分析:
再开个数组记录下id就好啦,然后trie是128叉的
代码:
求多模式串匹配,并且输出每个母串中出现的模式串编号,以及所有模式串出现的总次数
分析:
再开个数组记录下id就好啦,然后trie是128叉的
代码:
// // Created by TaoSama on 2015-11-27 // Copyright (c) 2015 TaoSama. All rights reserved. // //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> using namespace std; #define pr(x) cout << #x << " = " << x << " " #define prln(x) cout << #x << " = " << x << endl const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7; const int M = 500 * 200 + 10, S = 128; struct AcAutomata { int root, sz; int nxt[M][S], fail[M], id[M]; int newNode() { id[sz] = -1; memset(nxt[sz], -1, sizeof nxt[sz]); return sz++; } void init() { sz = 0; root = newNode(); } void insert(char *s, int x) { int n = strlen(s); int u = root; for(int i = 0; i < n; ++i) { int &v = nxt[u][s[i]]; if(v == -1) v = newNode(); u = v; } id[u] = x; } void build() { queue<int> q; fail[root] = root; for(int i = 0; i < S; ++i) { int &v = nxt[root][i]; if(~v) { fail[v] = root; q.push(v); } else v = root; } while(q.size()) { int u = q.front(); q.pop(); for(int i = 0; i < S; ++i) { int &v = nxt[u][i]; if(~v) { fail[v] = nxt[fail[u]][i]; q.push(v); } else v = nxt[fail[u]][i]; } } } bool query(char *s, int x) { int n = strlen(s); int u = root, ok = false; vector<int> ans; for(int i = 0; i < n; ++i) { u = nxt[u][s[i]]; for(int v = u; v != root; v = fail[v]) { if(~id[v]) { ok = true; ans.push_back(id[v]); } } } if(!ok) return false; printf("web %d: ", x); sort(ans.begin(), ans.end()); for(int i = 0; i < ans.size(); ++i) printf("%d%c", ans[i], " \n"[i == ans.size() - 1]); return true; } } ac; int n, q; char s ; int main() { #ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin); // freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout); #endif ios_base::sync_with_stdio(0); while(scanf("%d", &n) == 1) { ac.init(); for(int i = 1; i <= n; ++i) { char buf[205]; scanf("%s", buf); ac.insert(buf, i); } ac.build(); scanf("%d", &q); int ans = 0; for(int i = 1; i <= q; ++i) { scanf("%s", s); ans += ac.query(s, i); } printf("total: %d\n", ans); } return 0; }
相关文章推荐
- HDU4758 AC自动机+DP (HDU4758与HDU2222)
- AC自动机-一般算法实现
- 字符串的多模式匹配
- BZOJ1030 [JSOI2007]文本生成器【AC自动机+DP】
- BZOJ2434 [Noi2011]阿狸的打字机【AC自动机+dfs序+树状数组】
- AC自动机
- HDU_2222 大部分是别人的,有的地方稍有改动,代码有不完善的地方!
- AC自动机算法
- HDU-2222 Keyword Search
- 两天AC自动机的学习 HDOJ2222 HDOJ 2896
- ac自动机+矩阵
- hdu2222 ac自动机。。。。
- poj3691DNA repair
- hdu2222Keywords Search
- hdu 3065 病毒侵袭持续中
- poj 2778 AC自动机+dp矩阵快速幂
- 2015湖南省队集训DAY6——B题(BZOJ4179)
- HDU 2222
- POJ 3691 DNA repair
- KMP算法 AC自动机