博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 3065 病毒侵袭持续中 AC自动机
阅读量:6736 次
发布时间:2019-06-25

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

 AC自动机模板题,稍微改一改就可以了

这个题目坑在是多组样例输入

#include
using namespace std;const int maxn = 2000000+5;const int nsize = 26;struct node{ node *next[nsize]; node *fail; int sum;};node *root;int cnt[1005];//构造字典树void Insert(char *s, int id){ node *newnode,*p; p = root; for(int i = 0; s[i]; i++) { int x = s[i] - 'A'; if(p->next[x] == NULL) { newnode=(struct node *)malloc(sizeof(struct node)); for(int j=0; j
next[j] = 0; newnode->sum = 0; newnode->fail = 0; p->next[x]=newnode; } p = p->next[x]; } p->sum = id;}//构造失败指针void build_fail(){ queue
Q; Q.push(root); while (!Q.empty()) { node *p = Q.front(); Q.pop(); for(int i = 0; i < nsize; i++) { if (p->next[i]) { if (p == root) p->next[i]->fail = p; else { node *tmp = p->fail; while (tmp) { if (tmp->next[i]) { p->next[i]->fail = tmp->next[i]; break; } else tmp = tmp->fail; } if (!tmp) p->next[i]->fail = root; } Q.push(p->next[i]); } } } return ;}//匹配void ac_automation(char *ch){ node *p = root; int len = strlen(ch); for(int i = 0; i < len; i++) { if(ch[i] > 'Z' || ch[i] < 'A') { p = root; continue; } int x = ch[i] - 'A'; while(!p->next[x] && p != root) { p = p->fail; if(p->sum > 0) { cnt[p->sum]++; } } p = p->next[x]; if(!p) p = root; node *temp = p; while(temp != root) { if(temp->sum > 0) { cnt[temp->sum]++; } else break; temp = temp->fail; } }}char sbs[1005][55],str[maxn];int main(){// freopen("in.txt","r",stdin); int N; root=(struct node *)malloc(sizeof(struct node)); for(int j=0; j
next[j] = 0; root->fail = 0; root->sum = 0; while(~scanf("%d",&N)) { memset(cnt, 0, sizeof(cnt)); for(int i = 1; i <= N; i++) { scanf("%s", sbs[i]); Insert(sbs[i], i); } build_fail(); scanf("%s", str); ac_automation(str); for(int i = 1; i <= N; i++) { if(cnt[i] > 0) printf("%s: %d\n", sbs[i], cnt[i]); } } return 0;}

 

转载于:https://www.cnblogs.com/pach/p/7243452.html

你可能感兴趣的文章
(转)Spring读书笔记-----Spring的Bean之Bean的基本概念
查看>>
NUC1016 斐波那契数列
查看>>
hadoop安装
查看>>
【编码的法则】谨慎的使用static
查看>>
小白的进阶之路1
查看>>
python day2
查看>>
Spring MVC 3 深入总结
查看>>
滚动条 viewPager
查看>>
C 内存分配【转】
查看>>
掉了,全掉了。
查看>>
用canvas写一个h5小游戏
查看>>
JavaScript中的arguments,callee,caller
查看>>
HTML元素1: 基本元素,标题,段落,链接,图像等
查看>>
51Nod 1001 数组中和等于K的数对
查看>>
This Android SDK requires Android Developer Toolkit version 23.0.0 or above
查看>>
cnblogs-minor-mode.org
查看>>
List Box Macros
查看>>
echarts 折线图
查看>>
飞机大作战游戏 2----(运用H5和Js制作)
查看>>
Hello 畅连·西瓜 帮助与更新
查看>>