AC自动机 HDOJ 5384 Danganronpa
2015-08-17 20:53
302 查看
题目传送门
/* 题意:多个文本串,多个模式串在每个文本串出现的次数 AC自动机:这就是一道模板题,杭电有道类似的题目 */ /************************************************ * Author :Running_Time * Created Time :2015-8-14 14:14:32 * File Name :AC.cpp ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cmath> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <list> #include <map> #include <set> #include <bitset> #include <cstdlib> #include <ctime> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 typedef long long ll; const int MAXN = 1e5 + 10; const int MAXNODE = 6e5 + 10; const int INF = 0x3f3f3f3f; const int SIGMA_SIZE = 26; const int MOD = 1e9 + 7; ll res; struct AC { int ch[MAXNODE][SIGMA_SIZE], f[MAXNODE], sz; ll val[MAXNODE]; void init(void) { memset (ch[0], 0, sizeof (ch[0])); sz = 1; val[0] = 0; } int idx(char c) { return c - 'a'; } void insert(string s) { int u = 0; int len = s.size (); for (int i=0; i<len; ++i) { int c = idx (s[i]); if (!ch[u][c]) { memset (ch[sz], 0, sizeof (ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u]++; } void build(void) { queue<int> Q; f[0] = 0; for (int i=0; i<SIGMA_SIZE; ++i) { int u = ch[0][i]; if (u) { f[u] = 0; Q.push (u); } } while (!Q.empty ()) { int r = Q.front (); Q.pop (); for (int i=0; i<SIGMA_SIZE; ++i) { int u = ch[r][i]; if (!u) { ch[r][i] = ch[f[r]][i]; continue; } Q.push (u); f[u] = ch[f[r]][i]; val[u] += val[f[u]]; } } } ll query(string s) { int len = s.size (); ll ret = 0; int j = 0; for (int i=0; i<len; ++i) { int c = idx (s[i]); j = ch[j][c]; ret += val[j]; } return ret; } }ac; string t[MAXN], p; int main(void) { //HDOJ 5384 Danganronpa int T; scanf ("%d", &T); while (T--) { int n, m; scanf ("%d%d", &n, &m); ac.init (); for (int i=1; i<=n; ++i) cin >> t[i]; for (int i=1; i<=m; ++i) { cin >> p; ac.insert (p); } ac.build (); for (int i=1; i<=n; ++i) { printf ("%I64d\n", ac.query (t[i])); } } return 0; }
相关文章推荐
- HDU 1840 Equations
- js的2种继承方式详解
- cocos2dx 记录
- 实时获取浏览器的地址栏的网页地址
- HDU5387
- POJ 1183 反正切函数的应用
- 树莓派2model B 通过蓝牙实现A2DP协议连接手机播放音乐
- 5.ios-内存管理
- 使用POI创建Excel文件下载
- printf 打印全局和局部变量
- IOS UITableView 图片文字重叠问题
- POJ 1845 Sumdiv (快速幂+质因数+约数和公式+同余模)
- hdu 1875 畅通工程再续 (最小生成树)
- 学习笔记
- Sublime Text 常用插件
- iOS开发——多线程篇——多线程介绍
- android 第三方收集
- uva 10570 meeting with aliens
- 犀牛——第7章数组 7.9数组方法
- codeforces 250 div1 D