博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2896AC自动机
阅读量:4205 次
发布时间:2019-05-26

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

////  main.cpp//  AC自动机////  Created by liuzhe on 16/11/16.//  Copyright © 2016年 my_code. All rights reserved.//#include 
#include
#include
#include
#include
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 s[],int id) { int len = strlen(s); int now = root; for(int i = 0;i < len;i++) { if(next[now][s[i]] == -1) next[now][s[i]] = newnode(); now=next[now][s[i]]; } end[now]=id; } void build() { queue
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]); } } } bool used[510]; bool query(char buf[],int n,int id) { int len = strlen(buf); int now = root; memset(used,false,sizeof(used)); bool flag = false; for(int i = 0;i < len;i++) { now = next[now][buf[i]]; int temp = now; while(temp != root) { if(end[temp] != -1) { used[end[temp]] = true; flag = true; } temp = fail[temp]; } } if(!flag)return false; printf("web %d:",id); for(int i = 1;i <= n;i++) if(used[i]) printf(" %d",i); printf("\n"); return true; }};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;}

点击打开链接题意:给了病毒编号,又给了网站,问哪些网站中了病毒,并将中的病毒编号输出,最后输出共有多少网站中病毒思路:AC自动机模版题,将结构体里的num记为病毒编号就行了,我的代码如果将N设为128就会超内存,但是可见的ASCII只有32到127,不用计算空格,94就可以了[html] view plain copy#include 
#include
#include
#include
#include
using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=5000010; const int N=94; struct node{ node *fail; node *next[N]; int num; node(){ fail=NULL; num=0; memset(next,NULL,sizeof(next)); } }*q[maxn]; char str2[10003]; bool vis[503]; int head,tail; void insert_Trie(char *str,node *root,int cn){ node *p=root; int i=0; while(str[i]){ int id=str[i]-' '; if(p->next[id]==NULL) p->next[id]=new node(); p=p->next[id];i++; } p->num=cn; } void build_ac(node *root){ root->fail=NULL; q[head++]=root; while(head!=tail){ node *temp=q[tail++]; node *p=NULL; for(int i=0;i
next[i]!=NULL){ if(temp==root) temp->next[i]->fail=root; else{ p=temp->fail; while(p!=NULL){ if(p->next[i]!=NULL){ temp->next[i]->fail=p->next[i]; break; } p=p->fail; } if(p==NULL) temp->next[i]->fail=root; } q[head++]=temp->next[i]; } } } } int query(node *root){ int i=0,ans=0; node *p=root; while(str2[i]){ int id=str2[i]-' '; while(p->next[id]==NULL&&p!=root) p=p->fail; p=p->next[id]; p=(p==NULL)?root:p; node *temp=p; while(temp!=root){ vis[temp->num]=1; if(temp->num!=0) ans++; temp=temp->fail; } i++; } return ans; } int main(){ int n,m; while(scanf("%d",&n)!=-1){ node *root=new node(); head=tail=0; for(int i=0;i

转载地址:http://zsali.baihongyu.com/

你可能感兴趣的文章
操作2:mongodb使用语法
查看>>
如何给分类增加一个属性(后台)
查看>>
linux设置环境变量 临时设置 和 永久设置
查看>>
检查网站在世界各地的打开速度
查看>>
jquery 向上(顶部),向下(底部)滑动
查看>>
seo
查看>>
MySQL: InnoDB 还是 MyISAM?
查看>>
SQL语言的组成部分 ddl dcl dml
查看>>
mysql数据库从库同步延迟的问题
查看>>
1.mysql数据库主从复制部署笔记
查看>>
mysql数据库主从同步的问题解决方法
查看>>
mysql 配置 - on xFanxcy.com
查看>>
mysql一: 索引优化
查看>>
测试人员,今天再不懂BDD就晚了!
查看>>
害怕自动化(1)
查看>>
深圳市软件质量提升工程系列活动——安全测试百人大课堂
查看>>
LoadRunner如何在脚本运行时修改log设置选项?
查看>>
QC数据库表结构
查看>>
自动化测试工具的3个关键部分
查看>>
测试工具厂商的编程语言什么时候“退休”?
查看>>