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相关推荐

  1. HDU 2222 Keywords Search【ACAM】

    HDU 2222 Kerwords Search 代码风格模仿自:USETC每周算法讲解,AC自动机,郭老师! 输入一个T,对于每一个T给你一个n,接下来输入P个模式串,然后给你一个L串,L中出现了多 ...

  2. hdu 2222 Keywords Search ac自己主动机

    点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  3. hdu 2222:Keywords Search

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...

  4. hdu 2222 Keywords Search(ac自动机)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给你一系列子串,再给你一个主串问你主串一共有几个匹配子串 原来使用字典树写的但数据有点大T ...

  5. hdu 2222 Keywords Search AC自动机——多串匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...

  6. HDU 2222 Keywords Search (AC自动机模板题)

    一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...

  7. HDU - 2222 Keywords Search(AC自动机)

    题目链接:点击查看 题目大意:给出n个长度不超过50的模式串,再给出一个长度不超过1e6的主串,问模式串在主串中出现过多少次 题目分析:一开始我以为是求n次KMP,后来才知道这样做的时间复杂度是O(L ...

  8. 【AC自动机】HDU 2222 Keywords Search 裸题

    题意:给出的n个单词,出现在T中的个数. #include <stdio.h> #include <string.h> #include <stdlib.h> #i ...

  9. AC自动机(HDU 2222: Keywords Search)

    题意: 输入n个单词,再输入一篇文章,判断有多少个单词在文章中出现过 http://blog.csdn.net/niushuai666/article/details/7002823 注释都在代码里 ...

最新文章

  1. 线段树 ---- CF1004F Sonya and Bitwise OR(线段树上分治合并区间信息 + or 前缀和的log性质)
  2. Split in Java
  3. house price model
  4. gel和react哪个厉害_gel、react、boost三种材料的跑鞋,哪个更强?
  5. discuz3.1用哪个版本php版本好,Discuz应用中心安装模板提示版本号不匹配适用于X3.3 X3.2 X3.1的解决方法...
  6. C语言逗号表达式 - C语言零基础入门教程
  7. Linux添加相对库路径,Linux C编程(8) 使用相对路径加载动态库-rpath和$ORIGIN
  8. css文字上浮div,css文字样式与div
  9. Laravel渴求式加载
  10. 原型设计Axure下载安装
  11. HttpServletRequest获取中文参数乱码问题
  12. ssh弱口令暴力破解
  13. Metrics 入门教程
  14. 软件行业迎来拐点 厂商积极拥抱SaaS和云计算
  15. vivado安装步骤
  16. 2021年二级c语言采用的版本是,2021年二级c语言笔试必背-20210416065706.doc-原创力文档...
  17. unity制作法线贴图
  18. 浏览器在线查看pdf文件 pdf.js的使用教程
  19. XXL-Job分布式任务调度框架-- 介绍和调度中心的搭建启动1
  20. Android 自动化埋点:基于AspectJ的沪江SDK的使用整理

热门文章

  1. React开发(245):ant design form自定义验证
  2. [html] 如果要开发一个在超级大屏上显示的可视化页面,你首先要考虑什么?
  3. [css] 怎么让div中的图片和文字同时上下居中?
  4. [css] rem是如何实现自适应布局的?
  5. [css] 你所理解的css高级技巧有哪些?
  6. 工作111:直接写url
  7. 前端学习(1837):前端面试题之变量提升
  8. plsql轻量版存储过程和存储函数
  9. 前端学习(507):垂直居中的第二种方式的优缺点
  10. spring学习(50):延迟加载