HDU 2222 Keywords Search
HDU_2222
今天开始学AC自动机了,这个就是我AC自动机的处女作了。这个题有个小trick就是单词列表中可能有重复的单词,但这些重复的单词应看做不同的,因此建字典树时做标记的时候,把原来的赋值为1的操作变为自加1的操作即可。
最后匹配的时候有一个小优化,就是比如当前正在看有多少个以j结点的字符为结尾的单词,那么我们还需要不停地沿预处理的标记向上找,当我们找过之后就可以把当前节点的标记做成-1,以后再遇到-1的时候,就直接break,无需再沿着标记向上找了,因为上面的结点一定在之前就找过了。这个优化大概能节省400ms的时间。
#include<stdio.h>#include<string.h>#define MAXD 500010#define MAXT 1000010char b[60], txt[MAXT];int N, next[MAXD][26], flag[MAXD], P[MAXD], q[MAXD], e, cnt;void insert(int cur, int k){ ++ e; flag[e] = 0; memset(next[e], 0, sizeof(next[e])); next[cur][k] = e;}void init(){int i, j, k, cur; scanf("%d", &N); e = 0; memset(next[e], 0, sizeof(next[e]));for(i = 0; i < N; i ++) { scanf("%s", b); cur = 0;for(j = 0; b[j]; j ++) { k = b[j] - 'a';if(!next[cur][k]) insert(cur, k); cur = next[cur][k]; } ++ flag[cur]; }}void prepare(){int i, j, k, u, x, front, rear; front = rear = 0; P[0] = q[rear ++] = 0;while(front < rear) { u = q[front ++];for(i = 0; i < 26; i ++)if(next[u][i]) { x = next[u][i];if(u == 0) P[x] = 0;else {for(j = P[u]; j != 0; j = P[j])if(next[j][i]) { P[x] = next[j][i];break; }if(j == 0) P[x] = next[0][i]; } q[rear ++] = next[u][i]; } }}void solve(){int i, j, k, t; prepare(); scanf("%s", txt); j = cnt = 0;for(i = 0; txt[i]; i ++) { k = txt[i] - 'a';while(j > 0 && !next[j][k]) j = P[j]; j = next[j][k];for(t = j; t > 0; t = P[t]) {if(flag[t] >= 0) { cnt += flag[t]; flag[t] = -1; }elsebreak; } } printf("%d\n", cnt);}int main(){int t; scanf("%d", &t);while(t --) { init(); solve(); }return 0;}
转载于:https://www.cnblogs.com/staginner/archive/2012/01/13/2321760.html
HDU 2222 Keywords Search相关推荐
- HDU 2222 Keywords Search【ACAM】
HDU 2222 Kerwords Search 代码风格模仿自:USETC每周算法讲解,AC自动机,郭老师! 输入一个T,对于每一个T给你一个n,接下来输入P个模式串,然后给你一个L串,L中出现了多 ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- hdu 2222:Keywords Search
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...
- hdu 2222 Keywords Search(ac自动机)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给你一系列子串,再给你一个主串问你主串一共有几个匹配子串 原来使用字典树写的但数据有点大T ...
- hdu 2222 Keywords Search AC自动机——多串匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...
- HDU 2222 Keywords Search (AC自动机模板题)
一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...
- HDU - 2222 Keywords Search(AC自动机)
题目链接:点击查看 题目大意:给出n个长度不超过50的模式串,再给出一个长度不超过1e6的主串,问模式串在主串中出现过多少次 题目分析:一开始我以为是求n次KMP,后来才知道这样做的时间复杂度是O(L ...
- 【AC自动机】HDU 2222 Keywords Search 裸题
题意:给出的n个单词,出现在T中的个数. #include <stdio.h> #include <string.h> #include <stdlib.h> #i ...
- AC自动机(HDU 2222: Keywords Search)
题意: 输入n个单词,再输入一篇文章,判断有多少个单词在文章中出现过 http://blog.csdn.net/niushuai666/article/details/7002823 注释都在代码里 ...
最新文章
- 线段树 ---- CF1004F Sonya and Bitwise OR(线段树上分治合并区间信息 + or 前缀和的log性质)
- Split in Java
- house price model
- gel和react哪个厉害_gel、react、boost三种材料的跑鞋,哪个更强?
- discuz3.1用哪个版本php版本好,Discuz应用中心安装模板提示版本号不匹配适用于X3.3 X3.2 X3.1的解决方法...
- C语言逗号表达式 - C语言零基础入门教程
- Linux添加相对库路径,Linux C编程(8) 使用相对路径加载动态库-rpath和$ORIGIN
- css文字上浮div,css文字样式与div
- Laravel渴求式加载
- 原型设计Axure下载安装
- HttpServletRequest获取中文参数乱码问题
- ssh弱口令暴力破解
- Metrics 入门教程
- 软件行业迎来拐点 厂商积极拥抱SaaS和云计算
- vivado安装步骤
- 2021年二级c语言采用的版本是,2021年二级c语言笔试必背-20210416065706.doc-原创力文档...
- unity制作法线贴图
- 浏览器在线查看pdf文件 pdf.js的使用教程
- XXL-Job分布式任务调度框架-- 介绍和调度中心的搭建启动1
- Android 自动化埋点:基于AspectJ的沪江SDK的使用整理
热门文章
- React开发(245):ant design form自定义验证
- [html] 如果要开发一个在超级大屏上显示的可视化页面,你首先要考虑什么?
- [css] 怎么让div中的图片和文字同时上下居中?
- [css] rem是如何实现自适应布局的?
- [css] 你所理解的css高级技巧有哪些?
- 工作111:直接写url
- 前端学习(1837):前端面试题之变量提升
- plsql轻量版存储过程和存储函数
- 前端学习(507):垂直居中的第二种方式的优缺点
- spring学习(50):延迟加载