题目说是可见字符,ASCII码中可见字符的前面一位是' '空格,next数组大小100就可以了,字符转化成数字需要减去' '这个字符

#include<bits/stdc++.h>
using namespace std;const int maxn = 1e7 + 5;
const int nsize = 26;struct node
{node *next[nsize];node *fail;int sum;
};int cnt;
node *root;//构造字典树
void Insert(char *s)
{node *newnode,*p;p = root;for(int i = 0; s[i]; i++){int x = s[i] - 'a';if(p->next[x] == NULL){newnode=(struct node *)malloc(sizeof(struct node));for(int j=0; j<nsize; j++) newnode->next[j] = 0;newnode->sum = 0;newnode->fail = 0;p->next[x]=newnode;}p = p->next[x];}p->sum++;
}//构造失败指针
void build_fail() {queue<node*> Q;Q.push(root);while (!Q.empty()) {node *p = Q.front();Q.pop();for(int i = 0; i < nsize; i++) {if (p->next[i]) {if (p == root)p->next[i]->fail = p;else {node *tmp = p->fail;while (tmp) {if (tmp->next[i]) {p->next[i]->fail = tmp->next[i];break;}else tmp = tmp->fail;}if (!tmp) p->next[i]->fail = root;}Q.push(p->next[i]);}}}return ;
}//匹配
void ac_automation(char *ch)
{node *p = root;int len = strlen(ch);for(int i = 0; i < len; i++){int x = ch[i] - 'a';while(!p->next[x] && p != root){p = p->fail;if(p->sum > 0){cnt += p->sum;  //不想改变sun值就用vis数组标记p->sum = -1;}}p = p->next[x];if(!p) p = root;node *temp = p;while(temp != root){if(temp->sum > 0){cnt += temp->sum;temp->sum = -1;}else break;temp = temp->fail;}}
}char key[70],pattern[maxn];int main()
{
//    freopen("Input.txt","r",stdin);int T,N;scanf("%d",&T);while(T--){root=(struct node *)malloc(sizeof(struct node));for(int j=0; j<nsize; j++) root->next[j] = 0;root->fail = 0;root->sum = 0;scanf("%d",&N);getchar();for(int i = 1; i <= N; i++){gets(key);Insert(key);}gets(pattern);cnt = 0;build_fail();ac_automation(pattern);printf("%d\n",cnt);}return 0;
}

转载于:https://www.cnblogs.com/pach/p/7240975.html

hdu 2896 AC自动机相关推荐

  1. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  2. HDU 6208 AC自动机

    题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6208 给出n个字符串,要求找到一个字符串包含其他所有的字符串. 思路: 肯定是最长的那个字符串 ...

  3. hdu 3962(AC自动机+矩阵优化dp)

    转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472 题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA ...

  4. hdu 2222 ac自动机

    对于ac自动机的具体内容,请看如下博客:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 写的挺好的. 要了解ac自动机就要先知道 ...

  5. HDU 2222 AC自动机

    AC自动机模板题. 什么是Fai指针,指向出现了的最长后缀. 怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗? 不是的,还要继续往Fail指针上走,统计所有的cnt之和. 这个题目设计到,每 ...

  6. HDU 6096 AC自动机

    题解:  主要的思路就是怎么能让这两个串链接起来,还有就是明白AC自动机主要处理什么问题,知道了这些这个问题就能很好的解决了.. #include<bits/stdc++.h> #defi ...

  7. hdu 2222 AC 自动机 模版(数组实现)

    AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改 t个样例,n个单词,一个文本串,求文本串中单词出现的次数. 若给出单词ab,ab 文本ab,匹配数为2 若给出 n个不重复的单 ...

  8. HDU 2222(AC自动机模板)

    AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...

  9. HDU 6208 AC自动机 或 暴力?

    简略题意:问是否存在一个串,其他串都是他的子串. 看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了. 有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配.如果匹配到了所有串 ...

最新文章

  1. 基于运动信息的物体检测(背景差分法、帧间差分法和光流法)。
  2. 「轻松支付,只需几步」使用 LeanCloud 云代码接入支付宝示例
  3. 东芝发布15nm SG5固态硬盘 容量高达1TB
  4. 手动编写第一个javaWEB文件
  5. Spring MVC-09循序渐进之文件上传(基于Servlet3.0+Html5客户端上传文件)
  6. 老王Python-进阶篇4-面向对象第三节
  7. boost::fibers::algo::shared_work >用法的测试程序
  8. 2018暑假集训---递推递归----一只小蜜蜂hdu2044
  9. php文件锁解锁是删除对应的文件_软件 | 文件解锁强制删除工具 Wise Force Deleter v1.49...
  10. Standard C Episode 1
  11. Python多人聊天室
  12. Unity3D 《坦克大战》案例源码过程
  13. 最短路——迪杰斯特拉算法
  14. 1 Yocto 项目分析和跟踪手册
  15. C++11 使用智能指针封装 pimpl idom
  16. 【11】Activity的生命周期
  17. 【QT数字图像处理】(三)QSlider滑块学习
  18. 飞腾cpu服务器浪潮信息,推动国产化进程 浪潮发布飞腾服务器
  19. python 根号化简_Python 基础
  20. 【Node.js】深度解析node的包和强大的包管理工具

热门文章

  1. spring boot + swagger2
  2. Intelli IDEA快捷键(配合IdeaVim)
  3. Linux之FineBI集群部署 1
  4. 数据结构基础知识(2)
  5. String path = request.getContextPath
  6. 惭入佳境之HADOOP的NAMENODE不能正常启动的问题解决
  7. sysvol共享没有出现的处理办法!
  8. linux gdb 寄存器,x86 调试寄存器
  9. jsp+左间距_DIV间距设置
  10. ZooKeeper监控