HDU2896-病毒侵袭-ac自动机
2016-07-18 19:57
363 查看
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; char b[10001]; int visit[501]; struct s{ int id; s*fail,*a[95]; s() { id=0; fail=NULL; for(int i=0;i<95;i++) a[i]=NULL; } }*t,*p,*k; queue<s*>q; void insert(int n) { int i,j; k=t; for(i=0;b[i]!='\0';i++) { j=b[i]-32; if(k->a[j]==NULL) k->a[j]=new s(); k=k->a[j]; } k->id=n; } void BFS() { int i,j; q.push(t); while(!q.empty()) { p=q.front(); q.pop(); for(i=0;i<95;i++) { if(p->a[i]) { if(p==t) { p->a[i]->fail=t; } else { k=p->fail; while(k) { if(k->a[i]) { p->a[i]->fail=k->a[i]; break; } k=k->fail; } if(!k) p->a[i]->fail=t; } q.push(p->a[i]); } } } } int query() { int i,j,num=0; k=t; memset(visit,0,sizeof(visit)); for(i=0;b[i]!='\0';i++) { j=b[i]-32; while(k->a[j]==NULL&&k!=t) k=k->fail; k=k->a[j]; if(!k) k=t; p=k; while(p!=t&&p->id!=0) { num++; if(!visit[p->id]) visit[p->id]=1; p=p->fail; } } return num; } int main() { int n,m,i,j,l,num=0; scanf("%d",&n); t=new s(); for(i=1;i<=n;i++) { scanf("%s",b); insert(i); } BFS(); scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%s",b); l=query(); if(l) { printf("web %d:",i); for(j=1;j<=n;j++) { if(visit[j]) printf(" %d",j); } putchar('\n'); num++; } } printf("total: %d\n",num); return 0; }
相关文章推荐
- NYOJ 130 相同雪花(哈希入门)
- 再次制作一张复仇者联盟海报
- 伪元素黑魔法:一个替代onerror解决图片加载失败的方案
- 31. Next Permutation
- Hibernate框架基础知识第二第二天Hibernate的重要配置 1.基本配置天
- 设计模式-创建型-工厂方法模式(Factory Methods)
- curl模拟post请求提交
- U-boot移植及测试
- HDU 2059 龟兔赛跑(DP)
- 获取手机内所有视频信息
- java的重写、重载以及继承、多态和封装
- malloc、ralloc和calloc的用法及区别
- Java POI 读取 Execl 图片
- iOS多线程编程——浅谈NSOperation
- [HDU 5406] CRB and Apple (双线程DP+树状数组)
- jquery 上下滑动flip演示
- 0718
- JSON.parse()和JSON.stringify()的区别
- ORACLE和MYSQL查询表字段信息的sql
- linux 6下编译安装配置LAMP平台