hdu -2222 Keywords Search(AC自动机模板)
2015-06-28 14:53
417 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2222
求目标串出现了几个模式串.
求目标串出现了几个模式串.
#include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> #include <string> #include <set> #include <functional> #include <numeric> #include <sstream> #include <stack> #include <map> #include <queue> #define CL(arr, val) memset(arr, val, sizeof(arr)) #define ll long long #define inf 0x7f7f7f7f #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define L(x) (x) << 1 #define R(x) (x) << 1 | 1 #define MID(l, r) (l + r) >> 1 #define Min(x, y) (x) < (y) ? (x) : (y) #define Max(x, y) (x) < (y) ? (y) : (x) #define E(x) (1 << (x)) #define iabs(x) (x) < 0 ? -(x) : (x) #define OUT(x) printf("%I64d\n", x) #define lowbit(x) (x)&(-x) #define Read() freopen("din.txt", "r", stdin) #define Write() freopen("dout.txt", "w", stdout); #define Nn 510007 #define Mc 26 using namespace std; class Acautomaton { private: int chd[Nn][Mc]; int fail[Nn]; int ID[Mc]; int val[Nn]; int Q[Nn]; int sz; public: void Init() { fail[0] = 0; for (int i = 0; i < Mc; ++i) { ID[i] = i; } } void Reset() { CL(chd[0],0); sz = 1; } void insert(char *s,int key) { int p = 0; for (; *s; s++) { int k = ID[*s - 'a']; if (!chd[p][k]) { CL(chd[sz],0); val[sz] = 0; chd[p][k] = sz++; } p = chd[p][k]; } val[p] += key; } void Build() { int *s = Q ,*e = Q,i; for (i = 0; i < Mc; ++i) { if (chd[0][i]) { *e++ = chd[0][i]; fail[chd[0][i]] = 0; } } while (s != e) { int u = *s++; for (i = 0; i < Mc; ++i) { int &v = chd[u][i]; if (v) { *e++ = v; fail[v] = chd[fail[u]][i]; } else v = chd[fail[u]][i]; } } } int solve(char *s) { int p = 0; int k,ans = 0; for (; *s; s++) { k = ID[*s - 'a']; while (!chd[p][k] && p != 0) p = fail[p]; p = chd[p][k]; int rt = p; while (rt != 0 && val[rt] != -1) { ans += val[rt]; val[rt] = -1; rt = fail[rt]; } } return ans; } }ac; char str[57],tr[1000007]; int n; int main() { int T; int i; scanf("%d",&T); while (T--) { ac.Reset(); ac.Init(); scanf("%d",&n); for (i = 0; i < n; ++i) { scanf("%s",str); ac.insert(str,1); } ac.Build(); scanf("%s",tr); printf("%d\n",ac.solve(tr)); } return 0; }
相关文章推荐
- CSAPP的笔记与心得
- OJ期末模考D
- 编写systemd service文件
- 税后工资计算小程序
- 收敛 p75
- C++学习笔记——访问控制说明符
- Unity3d之A*算法在游戏中的应用(一)
- jquery 源码分析之Deferred
- 【算法】9 散列表【待补充】
- TFS源代码管理的8大注意事项
- ViewStub源码分析
- 评估指标:准确率(Precision)、召回率(Recall)以及F值(F-Measure)
- pixhawk学习笔记-----mavlink
- 一个关于多态之虚函数的例子
- OJ期末模考C
- 随机变量
- 10 个免费的服务器监控工具
- SCAN----Redis检索键值对
- doT js模板入门
- 136.求最大值