HDU 2896 病毒侵袭 (AC自动机)
2015-07-08 10:32
330 查看
记录串的id 用end数组来记录 ASCII可见字符从32~128
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> #include <queue> using namespace std; struct Trie { int next[205*500][128],fail[205*500],end[205*500]; int root,L; int newnode() //开辟空间 { for(int i = 0;i <128;i++) next[L][i] = -1; end[L++] = 0; return L-1; } void init() { L = 0; root = newnode(); } void insert(char buf[],int id) //trie树 { 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; //第一层指向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]); } } } bool used[550]; //标记出现过的 bool query(char buf[],int m, int id) { int len = strlen(buf); int now = root; memset(used,false,sizeof(used)); bool flag=false; int res = 0; for(int i = 0;i < len;i++) { now = next[now][buf[i]]; int temp = now; while( temp != root ) { if(end[temp]!=0) { used[end[temp]]=true; flag=true; } temp = fail[temp]; } } if(!flag) return false; cout<<"web "<<id<<":"; for(int i=1;i<=m;++i) { if(used[i]) cout<<" "<<i; } puts(""); return true; } }; char buf[10010]; Trie ac; int main() { int T; int n,m; while(~scanf("%d",&n)) { ac.init(); for(int i = 1;i <=n;i++) { scanf("%s",buf); ac.insert(buf,i); } ac.build(); cin>>m; int ans=0; for(int i=1;i<=m;++i) { scanf("%s",buf); if(ac.query(buf,n,i)) ans++; } cout<<"total: "<<ans<<endl; // printf("%d\n",ac.query(buf)); } return 0; }
相关文章推荐
- Android打开/关闭数据流量
- Gemfire集群配置服务的概述
- [异能程序员]第一章 酒后事发,上头条
- Makefile中wildcard的介绍
- 【转】Comet:基于 HTTP 长连接的“服务器推”技术
- 路由错误,请检查控制器目录下是否存在该控制器/动作
- maven教程二之仓库
- ibatis 动态sql prepend
- 学习笔记
- Java连接Sqlserver 2008总结
- 云主机的时代,虚拟主机该如何生存?
- Java PMD 安装地址
- Java 程序优化:字符串操作、基本运算方法等优化策略
- linux下mysql二进制方式安装
- Android SDK开发包国内下载地址
- hive内部表与外部表区别详细介绍
- solr性能优化
- spark on yarn的cpu使用
- android ListView几个比较特别的属性
- 1到1亿的自然数,求所有数的拆分后的数字之和