[HDU3065]病毒持续侵袭中(AC自动机)
来源:互联网 发布:关于宇宙的软件 编辑:程序博客网 时间:2024/06/06 02:36
题目描述
传送门
注意:题目有多组数据。
题解
之前写过这道题,但是感觉复杂度应该是
换了一个更科学的做法。就是每一次匹配都把它的权值+1,然后最后再fail树上统计子树和。
用到的性质就是fail树上的节点到根路径上的点都是这个点表示的字符串的前缀的后缀。
这样的话时间复杂度应该是
代码
#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;char virus[1005][55],s[2000005];int n,sz;int tot,point[50005],nxt[50005],v[50005];int ch[50005][130],fail[50005],is_end[1005],size[50005],cnt[50005];queue <int> q;void clear(){ sz=tot=0; memset(point,0,sizeof(point));memset(nxt,0,sizeof(nxt));memset(v,0,sizeof(v)); memset(ch,0,sizeof(ch));memset(fail,0,sizeof(fail));memset(is_end,0,sizeof(is_end)); memset(size,0,sizeof(size));memset(cnt,0,sizeof(cnt));}void insert(int id,char s[]){ int len=strlen(s),now=0; for (int i=0;i<len;++i) { int x=s[i]; if (!ch[now][x]) ch[now][x]=++sz; now=ch[now][x]; } is_end[id]=now;}void make_fail(){ while (!q.empty()) q.pop(); for (int i=0;i<=128;++i) if (ch[0][i]) q.push(ch[0][i]); while (!q.empty()) { int now=q.front();q.pop(); for (int i=0;i<=128;++i) { if (!ch[now][i]) { ch[now][i]=ch[fail[now]][i]; continue; } fail[ch[now][i]]=ch[fail[now]][i]; q.push(ch[now][i]); } }}void ac(){ int len=strlen(s),now=0; for (int i=0;i<len;++i) { int x=s[i]; int y=ch[now][x]; cnt[y]++; now=y; }}void add(int x,int y){ ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}void dfs(int x){ size[x]=cnt[x]; for (int i=point[x];i;i=nxt[i]) { dfs(v[i]); size[x]+=size[v[i]]; }}int main(){ while (~scanf("%d\n",&n)) { clear(); for (int i=1;i<=n;++i) { gets(virus[i]); insert(i,virus[i]); } gets(s); make_fail(); ac(); for (int i=1;i<=sz;++i) add(fail[i],i); dfs(0); for (int i=1;i<=n;++i) if (size[is_end[i]]) printf("%s: %d\n",virus[i],size[is_end[i]]); }}
0 0
- 【AC自动机】 hdu3065 病毒侵袭持续中
- hdu3065 病毒侵袭持续中--AC自动机
- HDU3065 病毒侵袭持续中 AC自动机
- hdu3065---病毒侵袭持续中(AC自动机)
- HDU3065 病毒侵袭持续中 AC自动机
- HDU3065病毒侵袭持续中AC自动机
- 【AC自动机】[HDU3065]病毒侵袭持续中
- 【HDU3065】病毒侵袭持续中(AC自动机)
- HDU3065 病毒侵袭持续中(AC自动机)
- hdu3065 病毒侵袭持续中 AC自动机
- HDU3065[病毒侵袭持续中] AC自动机
- HDU3065 病毒侵袭持续中(AC自动机)
- hdu3065 病毒侵袭持续中(AC自动机)
- [HDU3065]病毒持续侵袭中(AC自动机)
- [HDU3065]病毒持续侵袭中(AC自动机+fail树)
- hdu3065 病毒侵袭持续中(AC自动机)
- HDU3065:病毒侵袭持续中(AC自动机)
- hdu3065 病毒侵袭持续中 AC自动机入门
- Leetcode 之 Remove Linked List Elements
- 探寻跨平台开发最佳实践
- 五子棋游戏
- 关于国产项目Apache Kylin 发展历程及背后的那些事
- 总结71+2
- [HDU3065]病毒持续侵袭中(AC自动机)
- CH22.P438.....直接对元素和属性访问;
- 不同操作系统上屏蔽oracle的操作系统认证方式
- jQuery带筛选功能垂直导航代码-兼容IE8和Chrome浏览器
- 药店的药品销售统计系统(排序应用)
- 巧用边框:使用三个div画出一个八卦图形
- Nachos操作系统课设 浅谈优先级调度
- Android中通过ActionBar为标题栏添加搜索以及分享视窗
- 745 A. Hongcow Learns the Cyclic Shift codeforces