HDU 2896 病毒侵袭(AC自动机)
来源:互联网 发布:万德软件科技有限公司 编辑:程序博客网 时间:2024/05/18 03:32
解题思路:
对AC自动机算法的理解和应用,要注意的是,题目中的字符是128个ASCII码,而不是常用的26个英文字符,因此子节点的数目为128.
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <cstring>#include <vector>#include <queue>#include <string.h>#include <stack>#include <algorithm>using namespace std;struct Trie{ int next[210*500][128],fail[210*500],end[210*500]; int root,L; int newnode() { for(int i = 0;i < 128;i++) next[L][i] = -1; end[L++] = -1; return L-1; } void init() { L = 0; root = newnode(); } void insert(char buf[], int id) { int len = strlen(buf); int now = root; for(int i = 0;i < len;i++) { if(next[now][buf[i]] == -1) next[now][buf[i]] = newnode(); now = next[now][buf[i]]; } end[now] = id; } void build() { queue<int>Q; fail[root] = root; for(int i = 0;i < 128;i++) if(next[root][i] == -1) next[root][i] = root; else { fail[next[root][i]] = root; Q.push(next[root][i]); } while( !Q.empty() ) { int now = Q.front(); Q.pop(); for(int i = 0;i < 128;i++) if(next[now][i] == -1) next[now][i] = next[fail[now]][i]; else { fail[next[now][i]]=next[fail[now]][i]; Q.push(next[now][i]); } } } int vis[510]; int query(char buf[],int n, int id) { int len = strlen(buf); int now = root; int flag = 0; memset(vis, 0, sizeof(vis)); for(int i = 0;i < len;i++) { now = next[now][buf[i]]; int temp = now; while( temp != root ) { if(end[temp] != -1) { vis[end[temp]] = 1; flag = 1; } temp = fail[temp]; } } if(!flag) return 0; printf("web %d:", id); for(int i=1;i<=n;i++) if(vis[i]) printf(" %d", i); printf("\n"); return 1; }};char buf[10010];Trie ac;int main(){ int n, m; while(scanf("%d", &n)!=EOF) { ac.init(); for(int i=1;i<=n;i++) { scanf("%s", buf); ac.insert(buf, i); } ac.build(); int ans = 0; scanf("%d", &m); for(int i=1;i<=m;i++) { scanf("%s", buf); if(ac.query(buf, n, i)) ans++; } printf("total: %d\n", ans); } return 0;}
0 0
- HDU 2896 病毒侵袭 (AC自动机)
- hdu 2896 病毒侵袭 //AC自动机
- HDU 2896:病毒侵袭(AC自动机)
- hdu 2896 病毒侵袭 AC自动机
- HDU 2896 病毒侵袭(AC自动机)
- hdu 2896 病毒侵袭 AC自动机基础
- HDU 2896 病毒侵袭 AC自动机
- hdu 2896 病毒侵袭 -- AC自动机
- hdu 2896 病毒侵袭 (AC自动机)
- HDU 2896 病毒侵袭(AC 自动机)
- HDU 2896 病毒侵袭 (AC自动机)
- HDU 2896 病毒侵袭 【AC自动机】
- hdu 2896 病毒侵袭 AC自动机
- [HDU 2896]病毒侵袭[AC自动机]
- hdu 2896 病毒侵袭(AC自动机)
- hdu 2896 病毒侵袭(AC自动机)
- hdu 2896 病毒侵袭 (AC自动机)
- hdu 2896 病毒侵袭(AC自动机)
- [SCM]ASPx.net开发供应链系统,用来给供应商查询或做一些单据之类的
- C++网络编程概述(精)
- vim大小写转换 以及区块选择 复制粘贴
- Spring学习笔记——关于Spring注解扫描不能注入new对象问题
- 如何解决XML文件中的警告提示“No grammar constraints (DTD or XML Schema) referenced in the document.”
- HDU 2896 病毒侵袭(AC自动机)
- ny-单调递增最长子序列
- 第十一周 项目四 类族的设计】
- 提取 Microsoft.ReportViewer等dll
- 【算法】5 传说中的快排是怎样的,附实现示例
- java中栈的简单操作
- IUSR和IIS_IUSRS
- @SuppressWarnings
- iOS中Objective-C与JavaScript之间相互调用的实现(实现了与Android相同的机制)