HDU 2896 病毒侵袭
2014-04-02 20:59
190 查看
AC自动机模板题。重新学习,熟悉下。
#include<cstdio> #include<string> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> using namespace std; #define N 100005 char a[205]; char b[10005]; int ans[20]; int n, m; int idx; struct Trie { Trie *fail; Trie *son[128]; int ex; }; Trie t ; Trie *que ; int ptr; Trie *NewNode(){ Trie *p = &t[ptr++]; memset(p->son, NULL, sizeof(p->son)); p->fail = NULL; p->ex = -1; return p; } void Insert(int id, Trie *root){ Trie *tmp = root; for(int i = 0; a[i]; i++){ if(tmp->son[a[i]] == NULL) tmp->son[a[i]] = NewNode(); tmp = tmp->son[a[i]]; } tmp->ex = id; } void gfail(Trie *root){ int head = 0, tail = 0; que[tail++] = root; Trie *tmp; while(head < tail){ tmp = que[head++]; for(int i = 0; i < 128; i++){ if(tmp->son[i] != NULL){ Trie *next = tmp->fail; while(next != NULL && next->son[i] == NULL){ next = next->fail; } if(next == NULL) tmp->son[i]->fail = root; else tmp->son[i]->fail = next->son[i]; que[tail++] = tmp->son[i]; } } } } void AC(Trie *root){ Trie *tmp = root; for(int i = 0; b[i]; i++){ while(tmp->son[b[i]] == NULL && tmp != root){ tmp = tmp->fail; } if(tmp->son[b[i]] == NULL) tmp = root; else tmp = tmp->son[b[i]]; Trie *p = tmp; while(p != root && p->ex != -1){ ans[idx++] = p->ex; p = p->fail; } } } int main() { while(scanf("%d", &m) != EOF){ ptr = 0; Trie *root = NewNode(); for(int i = 0; i < m; i++){ scanf("%s", a); Insert(i, root); } gfail(root); scanf("%d", &n); int tot = 0; for(int i = 0; i < n; i++){ idx = 0; scanf("%s", b); AC(root); if(idx){ sort(ans, ans + idx); printf("web %d: ", i + 1); for(int i = 0; i < idx; i++){ printf("%d ", ans[i] + 1); } printf("\n"); tot ++; } } printf("total: %d\n", tot); } return 0; }
相关文章推荐
- git常用命令
- Web开发中常用的linux命令 详解
- Apollo Rule Reverse
- Matlab GUI保存图片
- 排序专题
- 米兰达可儿上演辣妈正传 美胸翘臀玩诱惑!
- 一步步学习微软InfoPath2010和SP2010--第十一章节--创建批准流程(3)--表单视图
- ACM计算几何题目推荐
- Web开发中Linux下常用命令和应用部署
- POJ 2693 Chocolate Chip Cookies 题解 (计算几何)
- 一步步学习微软InfoPath2010和SP2010--第十一章节--创建批准流程(3)--表单视图
- GOOGLE HACK
- LaTeX之表格中强制换行
- iOS 修改textholder的颜色
- prim算法
- 界面,数据下载
- HorizontalScrollView水平滚动控件的使用
- 张国祥老师应邀到联创系统班昆明学员企业指导流程优化
- linux系统之iptables其三NAT的用法
- java.nio.ByteBuffer用法小结