HDU - 2222 AC自动机模板题
来源:互联网 发布:c语言函数手册下载 编辑:程序博客网 时间:2024/06/05 10:44
题意:
多个模式串在文本串中匹配。
思路:
AC自动机模板,AC自动机其实就是KMP与Trie的结合。
代码:
#include <bits/stdc++.h>using namespace std;const int SIGMA_SIZE = 26;const int MAXNODE = 500010;const int MAXS = 1e4 + 10;map <string, int> ms;struct AhoCorasickAutomata { int ch[MAXNODE][SIGMA_SIZE]; int f[MAXNODE]; // fail函数 int val[MAXNODE]; // 每个字符串的结尾结点都有一个非0的val int last[MAXNODE]; // 输出链表的下一个结点 int cnt[MAXS]; int sz; void init() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); memset(cnt, 0, sizeof(cnt)); ms.clear(); } // 字符c的编号 int idx(char c) { return c - 'a'; } // 插入字符串。v必须非0 void Insert(char *s, int v) { int u = 0, n = strlen(s); for (int i = 0; i < n; 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] = v; ms[string(s)] = v; } // 递归打印以结点j结尾的所有字符串 void print(int j) { if (j) { cnt[val[j]]++; print(last[j]); } } // 在T中找模板 void Find(char* T) { int n = strlen(T); int j = 0; // 当前结点编号,初始为根结点 for (int i = 0; i < n; i++) { // 文本串当前指针 int c = idx(T[i]); while (j && !ch[j][c]) j = f[j]; // 顺着细边走,直到可以匹配 j = ch[j][c]; if (val[j]) print(j); else if (last[j]) print(last[j]); // 找到了! } } // 计算fail函数 void getFail() { queue <int> q; f[0] = 0; // 初始化队列 for (int c = 0; c < SIGMA_SIZE; c++) { int u = ch[0][c]; if (u) { f[u] = 0; q.push(u); last[u] = 0; } } // 按BFS顺序计算fail while (!q.empty()) { int r = q.front(); q.pop(); for (int c = 0; c < SIGMA_SIZE; c++) { int u = ch[r][c]; if (!u) continue; q.push(u); int v = f[r]; while (v && !ch[v][c]) v = f[v]; f[u] = ch[v][c]; last[u] = val[f[u]] ? f[u] : last[f[u]]; } } }};AhoCorasickAutomata ac;char text[1000010], P[10010][60];int n;int main() { //freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while (T--) { ac.init(); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%s", P[i]); ac.Insert(P[i], i); } ac.getFail(); scanf("%s", text); ac.Find(text); int ans = 0; for (int i = 1; i <= n; i++) { if (ac.cnt[ms[string(P[i])]]) ++ans; } printf("%d\n", ans); } return 0;}
0 0
- hdu 2222 AC自动机模板题
- hdu 2222 AC自动机模板题
- hdu 2222 ac自动机模板题
- HDU 2222 ac自动机入门模板题
- HDU 2222 AC自动机模板题
- HDU - 2222 AC自动机模板题
- hdu 2222 ac自动机模板题
- hdu 2222AC自动机模板题
- HDU 2222 ac自动机模板题
- hdu 2222(AC自动机模板)
- HDU - 2222 AC 自动机模板
- HDU 2222 AC自动机模板
- hdu 2222 ac自动机模板
- hdu 2222 ac自动机 模板
- hdu 2222 ac自动机模板
- HDU 2222 AC自动机模板
- HDU 2222 AC自动机 模板
- AC自动机 模板 hdu 2222
- Java中Comparable和Comparator区别小结
- uva 6952 Cent Savings dp
- 小词汇量的语音识别
- 黑白棋游戏
- 快速排序算法
- HDU - 2222 AC自动机模板题
- 优秀的程序员凡事先上谷歌搜索,哈哈
- Android混合方式开启服务
- salesforce 零基础学习(六十六)VF页面应善于使用变量和函数(二)常用函数的使用
- 机器学习:支持向量机(Support Vector Machine, SVM)
- n a^o7 !
- PAT
- 资料链接
- ConstraintLayout