HDU 3065 病毒侵袭持续中 (AC自动机 + hdu有毒)
2016-07-30 09:28
375 查看
原题网址:
http://acm.hdu.edu.cn/showproblem.php?pid=3065题意:
因为是中文题,我就不翻译成英语了。。。思路:
ac自动机的模板题。吐槽:
hdu有毒,明明没说多组样例,但删了while(cin>>)就错了,,,就WA了,,,这不是很尴尬,能不能把中文说清楚。。。#include <bits/stdc++.h> #define maxnode 50001 #define sigma 128 using namespace std; int num[1010]; struct ac_automation{ int ch[maxnode][sigma]; // maxnode 一般设置为 模式串数量*模式串长度 //ch数组里存的都是位置信息,甚至包含了一些失效指针的信息。 int val[maxnode]; //int cnt[maxnode]; // count int last[maxnode]; // 储存着最后在查询时需要向上层回溯的地址。 int f[maxnode]; // fail指针 int sz; // the num of the trie int ans; // answer void clear(){ sz = 1; ans = 0; memset(ch[0],0,sizeof(ch[0])); memset(val,0,sizeof(val)); //memset(cnt,0,sizeof(cnt)); } int idx(char c){ return (int)c; } void insert(char s[],int v){ int u = 0; for(int i = 0; s[i];i++){ int c = idx( s[i] ); if(!ch[u][c]){ memset(ch[sz],0,sizeof(ch[sz])); ch[u][c] = sz++; } u = ch[u][c]; } //cnt[u]++; val[u] = v; } void build(){ queue<int> q; f[0] = 0; for(int i = 0;i < sigma;i++){ if(ch[0][i]){ f[ch[0][i]] = 0; q.push(ch[0][i]); last[ch[0][i]] = 0; } } while(!q.empty()){ int now = q.front(); q.pop(); for(int i = 0;i < sigma ;i++){ int son = ch[now][i]; if(!son){ ch[now][i] = ch[f[now]][i]; continue; } q.push(son); f[son] = ch[f[now]][i]; last[son] = val[f[son]] ? f[son] : last[f[son]]; } } } void find(char *s){ int u = 0; for(int i = 0;s[i];i++){ int c = idx(s[i]); u = ch[u][c]; if(val[u]){ print(u); } else{ print(last[u]); } } } void print(int u){ if(u){ if(val[u])num[val[u]]++; //ans += cnt[u]; //cnt[u] = 0; print(last[u]); } } }ac; char sub[1001][52]; char text[2000002]; int main(){ int n; while(cin>>n){ memset(sub,0,sizeof(sub)); memset(num,0,sizeof(num)); ac.clear(); for(int i = 1;i <= n;i++){ scanf("%s",sub[i]); ac.insert(sub[i],i); } ac.build(); scanf("%s",text); ac.find(text); for(int i = 1;i <= n;i++){ if(num[i] != 0){ printf("%s: %d\n",sub[i],num[i]); } } } }
相关文章推荐
- Android RecyclerView 使用完全解析 体验艺术般的控件
- 在Linux环境下mysql的root密码忘记解决方法 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 2.修改MySQL的登录设置: # vi /etc/my.c
- Java (for循环基础应用)
- android之存储篇_SQLite数据库_让你彻底学会SQLite的使用
- catalan数
- JSP/SERVLET入门教程--Servlet 使用入门
- 微信支付—关于sgin签名的坑
- 单点登录SSO
- 设计模式之命令模式(Command Pattern)
- linux进程总结
- 11个炫酷的Linux终端命令大全
- SDUT2139图结构练习——BFS——从起始点到目标点的最短步数
- IOS树视图学习总结
- Linux文件系统与目录配置
- NYOJ 14 会场安排问题(经典题目,贪心,区间问题)
- SQL IN ANY ,(all any) 区别
- Centos7 关闭防火墙,过滤端口
- websocket相关
- 浅析RPC
- HDU-5053-the Sum of Cube【打表】