hdu 3065 病毒侵袭持续中(AC自动机)
来源:互联网 发布:python中什么叫装饰器 编辑:程序博客网 时间:2024/06/03 16:43
AC自动机第三题了,交上去1A真的爽,(题目没说多组坑了一发不能算,哼!)
其它oj不知道,hdu貌似对内存的统计是按使用过的内存来的,而不是按你申请的内存,然后静态字典树的话,只要动态使用数组就不会(其实就是不要一开始就整个初始化了)mle了。
然后当next[now][i]==-1的时候,直接让其等于next[fail[now]][i]这个优化真的不要太好,不仅时间上优化了,代码复杂度也是优化很多。
这道题唯一需要注意的地方就是,匹配的时候当匹配串出现不是26个英文大写字母的时候,直接让now=root,然后continue,因为病毒里,或者说字典树上没有 除这26个大写字母之外的字符。
代码:
#include <bits/stdc++.h>using namespace std;const int maxn=2e6+5;char str[maxn];char a[1005][55];int ans[1005];int book[1005];int k;struct acho{ int nex[1000*50+10][27], cnt[1000*50+10], fail[1000*50+10]; int L, root; int newnode() { for(int i=0; i<26; i++)nex[L][i]=-1; cnt[L++]=0; return L-1; } void init() { L=0; root=newnode(); } void insert(char *a, int id) { int now=root; for(int i=0; a[i]; i++) { if(nex[now][a[i]-'A']==-1) { nex[now][a[i]-'A']=newnode(); } now=nex[now][a[i]-'A']; } cnt[now]=id; return; } queue<int>que; void build() { while(que.empty()==0)que.pop(); int now=root; for(int i=0; i<26; i++) { if(nex[now][i]==-1)nex[now][i]=root; else { fail[nex[now][i]]=root; que.push(nex[now][i]); } } while(que.empty()==0) { now=que.front(); que.pop(); for(int i=0; i<26; i++) { if(nex[now][i]==-1) { nex[now][i]=nex[fail[now]][i]; } else { fail[nex[now][i]]=nex[fail[now]][i]; que.push(nex[now][i]); } } } return; } void match(char *a) { memset(book, 0, sizeof book); k=0; int now=root; for(int i=0; a[i]; i++) { if(a[i]<'A' || a[i]>'Z') { now=root; continue; } now=nex[now][a[i]-'A']; if(cnt[now]>0) { int v=now; while(v!=root) { if(cnt[v]>0) { if(book[cnt[v]]==0) { ans[k++]=cnt[v]; } book[cnt[v]]++; } v=fail[v]; } } } return; }}acho;int main(){ int n, i, j; while(~scanf("%d", &n)) { acho.init(); for(i=1; i<=n; i++) { scanf("%s", a[i]); acho.insert(a[i], i); } acho.build(); scanf("%s", str); acho.match(str); for(i=1; i<=n; i++) { if(book[i])printf("%s: %d\n", a[i], book[i]); } } }
阅读全文
0 0
- HDU 病毒侵袭持续中(AC自动机)
- AC自动机 病毒侵袭持续中 HDU
- HDU 3065 病毒侵袭持续中(AC自动机)
- hdu 3065 病毒侵袭持续中 //AC自动机
- HDU 3065:病毒侵袭持续中(AC自动机)
- HDU 3065 病毒侵袭持续中 AC自动机
- hdu 3065 病毒侵袭持续中 AC自动机模版题
- hdu 3065 病毒侵袭持续中 - AC自动机
- HDU 3065 病毒侵袭持续中(AC自动机模板)
- [HDU 3065]病毒侵袭持续中[AC自动机][模板题]
- hdu 3065 病毒侵袭持续中(AC自动机)
- hdu 3065 病毒侵袭持续中(AC自动机)
- hdu 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 AC 自动机再来。。 病毒持续侵袭中
- HDU 3065 病毒侵袭持续中(AC自动机)
- hdu 3065 病毒侵袭持续中(AC自动机)
- [hdu 3065] 病毒侵袭持续中(AC自动机)
- hdu 3065 病毒侵袭持续中 ac自动机
- 51nod 1239 欧拉函数之和
- 520.Detect Capital(String-Easy)
- HttpClient4.5-第一章基础
- Bootstrap 3.3.7学习笔记15
- 并发并行与Go并发编程
- hdu 3065 病毒侵袭持续中(AC自动机)
- 学习Linux命令(36)
- mysql-5.7.18 Archive压缩版安装
- MAC/Linux Vi配置环境变量及Java环境变量配置
- Android Studio趣味注释,你值得拥有
- 【OkHttp3源代码分析】(一)Request的execute
- 华为OJ--合唱队
- Android-拼图小游戏
- 自定义LayoutManager实现android-pile-layout滑动卡片堆叠效果