博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDOJ】2896 病毒侵袭
阅读量:5980 次
发布时间:2019-06-20

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

AC自动机模板题。

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 #define TRIEN 128 8 #define MAXN 505 9 10 typedef struct Trie { 11 int in; 12 Trie *fail; 13 Trie *next[TRIEN]; 14 Trie() { 15 in = 0; 16 fail = NULL; 17 memset(next, 0, sizeof(next)); 18 } 19 } Trie; 20 21 Trie *root; 22 char src[205], des[10005]; 23 bool visit[MAXN]; 24 25 void create(char str[], int in) { 26 int i = 0, id; 27 Trie *p = root, *q; 28 29 while (str[i]) { 30 id = str[i]; 31 ++i; 32 if (p->next[id] == NULL) { 33 q = new Trie(); 34 p->next[id] = q; 35 } 36 p = p->next[id]; 37 } 38 p->in = in; 39 } 40 41 void build_fail() { 42 int i; 43 Trie *p, *q; 44 queue
que; 45 46 for (i=0; i
next[i]) { 48 root->next[i]->fail = root; 49 que.push(root->next[i]); 50 } 51 } 52 53 while (!que.empty()) { 54 p = que.front(); 55 que.pop(); 56 for (i=0; i
next[i]) { 58 q = p->fail; 59 while (q != NULL) { 60 if (q->next[i]) { 61 p->next[i]->fail = q->next[i]; 62 break; 63 } 64 q = q->fail; 65 } 66 if (q == NULL) 67 p->next[i]->fail = root; 68 que.push(p->next[i]); 69 } 70 } 71 } 72 } 73 74 void search() { 75 int i = 0, id; 76 Trie *p = root, *tmp; 77 78 while (des[i]) { 79 id = des[i]; 80 ++i; 81 while (p->next[id]==NULL && p!=root) 82 p = p->fail; 83 p = p->next[id]; 84 if (p == NULL) 85 p = root; 86 tmp = p; 87 while (tmp != root) { 88 visit[tmp->in] = true; 89 tmp = tmp->fail; 90 } 91 } 92 } 93 94 void del(Trie *t) { 95 if (t == NULL) 96 return ; 97 for (int i=0; i
next[i]); 99 delete t;100 }101 102 int main() {103 int n, m, cnt, total;104 int i;105 106 while (scanf("%d",&n) != EOF) {107 root = new Trie();108 for (i=1; i<=n; ++i) {109 scanf("%s", src);110 create(src, i);111 }112 build_fail();113 scanf("%d", &m);114 total = 0;115 for (i=1; i<=m; ++i) {116 scanf("%s", des);117 memset(visit, false, sizeof(visit));118 search();119 cnt = 0;120 for (int j=1; j<=n; ++j) {121 if (visit[j]) {122 if (!cnt)123 printf("web %d:", i);124 ++cnt;125 printf(" %d", j);126 }127 }128 if (cnt) {129 printf("\n");130 ++total;131 }132 }133 printf("total: %d\n", total);134 del(root);135 }136 137 return 0;138 }

 

转载于:https://www.cnblogs.com/bombe1013/p/3815895.html

你可能感兴趣的文章
EF Code First学习笔记:数据库创建
查看>>
终结符、非终结符
查看>>
Node.js刷新session过期时间
查看>>
详解Javascript中的Array对象
查看>>
iOS:即时通讯之<了解篇 SocKet>
查看>>
@EnableTransactionManagement注解理解
查看>>
vue前后分离动态路由和权限管理方案
查看>>
《JavaScript高级程序设计》读书笔记(十):本地对象Date
查看>>
linux中fork()函数详解
查看>>
从1G到5G,46年屏幕变迁下,富士康、苹果、三星、华为的浴火重生路 ...
查看>>
##II 第四单元##管理系统中的简单分区和文件系统
查看>>
用flash测试你的ircd
查看>>
白话红黑树系列之二——红黑树的构建
查看>>
客户的一张表中出现重复数据,而该列由唯一键约束,重复值如何产生的呢?...
查看>>
MySQL5.6中新增特性、不推荐使用的功能以及废弃的功能
查看>>
OnePlus安装Kali-NetHunter
查看>>
[Oracle][DataGuard]Standby数据库文件有损坏时的处理方法
查看>>
JavaScript:Array 对象
查看>>
PDFCreator:一款免费,开源的PDF(Tiff,pcx,png,jpeg,bmp,PS,EPS)打印机(VB,GPL),并提供了COM接口,方便使用各种编程语言调用...
查看>>
Note 1773479 - SYB: Displaying multiple triggers per object
查看>>