博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2896 病毒侵袭 AC自动机——多串匹配
阅读量:6476 次
发布时间:2019-06-23

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

题意:中文......

思路:

这里就知识循环枚举每一个网址即可,set记录每个网址包含的病毒的编号。

//#pragma comment(linker,"/STACK:327680000,327680000")#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define CL(arr, val) memset(arr, val, sizeof(arr))#define lc l,m,rt<<1#define rc m + 1,r,rt<<1|1#define pi acos(-1.0)#define ll long long#define L(x) (x) << 1#define R(x) (x) << 1 | 1#define MID(l, r) (l + r) >> 1#define Min(x, y) (x) < (y) ? (x) : (y)#define Max(x, y) (x) < (y) ? (y) : (x)#define E(x) (1 << (x))#define iabs(x) (x) < 0 ? -(x) : (x)#define OUT(x) printf("%I64d\n", x)#define lowbit(x) (x)&(-x)#define Read() freopen("din.txt", "r", stdin)#define Write() freopen("dout.txt", "w", stdout);#define M 57#define N 1000007using namespace std;struct node{ int cnt; node *fail; node *next[95]; void newnode() { cnt = 0; fail = NULL; for (int i = 0; i < 95; ++i) { next[i] = NULL; } }};set
iSet[1007];struct AC_Automat{public: node *q[N],*root,H[N]; int fr,tl; int t; void init() { fr = tl = 0; t = 0; H[t].newnode(); root = &H[t++]; for (int i = 0; i <= 1000; ++i) iSet[i].clear(); } void insert(char *s,int no) { int i,k; int len = strlen(s); node *p = root; for (i = 0; i < len; ++i) { k = s[i] - 32; if (p->next[k] == NULL) { H[t].newnode(); p->next[k] = &H[t++]; } p = p->next[k]; } p->cnt = no; } void build() { int i; root->fail = NULL; q[tl] = root; node *p; while (fr <= tl) { node *tmp = q[fr++]; for (i = 0; i < 95; ++i) { if (tmp->next[i]) { if (tmp == root) tmp->next[i]->fail = root; else { p = tmp->fail; while (p != NULL) { if (p->next[i]) { tmp->next[i]->fail = p->next[i]; break; } p = p->fail; } if (p == NULL) tmp->next[i]->fail = root; } q[++tl] = tmp->next[i]; } } } } void query(char *s,int no) { int i,k; int len = strlen(s); node *p = root; for (i = 0; i < len; ++i) { k = s[i] - 32; while (p->next[k] == NULL && p != root) p = p->fail; p = p->next[k]; if (p == NULL) p = root; node *tmp = p; while (tmp != root) { if (tmp->cnt != 0) { iSet[no].insert(tmp->cnt); } tmp = tmp->fail; } } }}ac;int n,m;char s1[202],s2[10007];int main(){ int i; while (~scanf("%d",&n)) { ac.init(); for (i = 1; i <= n; ++i) { scanf("%s",s1); ac.insert(s1,i); } ac.build(); scanf("%d",&m); for (i = 1; i <= m; ++i) { scanf("%s",s2); ac.query(s2,i); } int tol = 0; set
::iterator it; for (i = 1; i <= m; ++i) { if (iSet[i].size() >= 1) { printf("web %d:",i); tol++; for (it = iSet[i].begin(); it != iSet[i].end(); ++it) { printf(" %d",*it); } printf("\n"); } } printf("total: %d\n",tol); } return 0;}

  

 

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

你可能感兴趣的文章
graph-tool 练习
查看>>
easyui treegrid逐步加载
查看>>
GraphicsLab Project之辉光(Glare,Glow)效果 【转】
查看>>
<转>Python: __init__.py 用法
查看>>
Linux Curl命令
查看>>
046 SparlSQL中的函数
查看>>
Zookeeper 的 Lua 绑定(二)
查看>>
-27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found...
查看>>
[LeetCode] Minimum Depth of Binary Tree
查看>>
,net运行框架
查看>>
Java 中 Emoji 的正则表达式
查看>>
Mixin Network第一届开发者大赛作品介绍- dodice, diceos和Fox.one luckycoin
查看>>
安卓Glide(4.7.1)使用笔记 01 - 引入项目
查看>>
中金易云:为出版社找到下一本《解忧杂货店》
查看>>
Flex布局
查看>>
Material Design之 AppbarLayout 开发实践总结
查看>>
Flutter之MaterialApp使用详解
查看>>
DataBinding最全使用说明
查看>>
原生Js交互之DSBridge
查看>>
Matlab编程之——卷积神经网络CNN代码解析
查看>>