博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2896 病毒侵袭 AC自动机
阅读量:6224 次
发布时间:2019-06-21

本文共 2487 字,大约阅读时间需要 8 分钟。

//#pragma comment(linker, "/STACK:1024000000,1024000000")#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef pair
pii;#define pb(a) push_back(a)#define INF 0x1f1f1f1f#define lson idx<<1,l,mid#define rson idx<<1|1,mid+1,r#define PI 3.1415926535898template
T min(const T& a,const T& b,const T& c) { return min(min(a,b),min(a,c));}template
T max(const T& a,const T& b,const T& c) { return max(max(a,b),max(a,c));}void debug() {#ifdef ONLINE_JUDGE#else freopen("d:\\in.txt","r",stdin); // freopen("d:\\out1.txt","w",stdout);#endif}int getch() { int ch; while((ch=getchar())!=EOF) { if(ch!=' '&&ch!='\n')return ch; } return EOF;}const int SIGMA_SIZE=128;struct node{ node *next[SIGMA_SIZE]; node *fail; int val; node(){memset(next,0,sizeof(next));fail=NULL;val=0;}};struct ACAutomation{ node* root; void init(){root=new node;} int insert(const char *s,const int& v) { node *p=root; for(int i=0;s[i]!='\0';i++) { if(p->next[s[i]]!=NULL)p=p->next[s[i]]; else p=p->next[s[i]]=new node; } p->val=v; return 0; } int construct() { root->fail=root; queue
q; for(int c=0;c
next[c]; if(u!=NULL){u->fail=root;q.push(u);} } while(!q.empty()) { node *r=q.front();q.pop(); for(int c=0;c
next[c]; if(u==NULL){r->next[c]=r->fail->next[c];continue;} q.push(u); node* v=r->fail; while(v!=root&&v->next[c]!=NULL)v=v->fail; u->fail=v->next[c]; } } return 0; } void count(node *u,int &num,int *da) { if(u->val&&!da[u->val]) { num++; da[u->val]=1; } if(u->fail!=root&&!da[u->fail->val])count(u->fail,num,da); } int find(const char *s,int *da) { int num=0; node * u=root; for(int i=0;s[i]!='\0';i++) { u=u->next[s[i]]; if(u->val)count(u,num,da); } return num; } void free(node *p) { for(int c='a';c
next[c]!=NULL)free(p->next[c]); delete p; }}ac;int n,m;char T[10010];int main(){ while(scanf("%d",&n)!=EOF) { ac.init(); char s[222]; for(int i=1;i<=n;i++) { scanf("%s",s); ac.insert(s,i); } ac.construct(); scanf("%d",&m); int num=0; for(int i=1;i<=m;i++) { scanf("%s",T); int da[555]; memset(da,0,sizeof(da)); int k=ac.find(T,da); if(k>0) { printf("web %d:",i); for(int j=1;j<=500;j++)if(da[j]) printf(" %d",j); printf("\n"); num++; } } printf("total: %d\n",num); // ac.free(ac.root); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/BMan/p/3374631.html

你可能感兴趣的文章
『TensotFlow』转置卷积
查看>>
windows 7系统搭建PHP网站环境
查看>>
MySQL系统变量 sql_mode 详解
查看>>
css样式表中的样式覆盖顺序
查看>>
MYSQL中group_concat有长度限制!默认1024(转载)
查看>>
boostrap
查看>>
游乌镇
查看>>
使用socket.io client 开发时兼容IE低版本的办法
查看>>
rsync远程同步
查看>>
AdaBoostClassifier实战
查看>>
Android如何配置init.rc中的开机启动进程(service)【转】
查看>>
redis09---redis 服务器端命令
查看>>
054——VUE中vue-router之实例讲解定义一下单页面路由
查看>>
C语言 - .c和.h文件的困惑
查看>>
ASP .NET CORE MVC 部署Windows 系统上 IIS具体步骤---.Net Core 部署到 IIS位系统中的步骤...
查看>>
Python2.x与3.x版本区别
查看>>
大数据时代的结构化存储—HBase在阿里的应用实践
查看>>
利用socket模拟http的混合表单上传(在一个请求中提交表单并上传多个文件)
查看>>
在AD中存取照片
查看>>
sqlite3 支持的关联查询
查看>>