hdu 2896 AC自动机
题目说是可见字符,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自动机相关推荐
- hdu 3065 AC自动机
// hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...
- HDU 6208 AC自动机
题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6208 给出n个字符串,要求找到一个字符串包含其他所有的字符串. 思路: 肯定是最长的那个字符串 ...
- hdu 3962(AC自动机+矩阵优化dp)
转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472 题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA ...
- hdu 2222 ac自动机
对于ac自动机的具体内容,请看如下博客:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 写的挺好的. 要了解ac自动机就要先知道 ...
- HDU 2222 AC自动机
AC自动机模板题. 什么是Fai指针,指向出现了的最长后缀. 怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗? 不是的,还要继续往Fail指针上走,统计所有的cnt之和. 这个题目设计到,每 ...
- HDU 6096 AC自动机
题解: 主要的思路就是怎么能让这两个串链接起来,还有就是明白AC自动机主要处理什么问题,知道了这些这个问题就能很好的解决了.. #include<bits/stdc++.h> #defi ...
- hdu 2222 AC 自动机 模版(数组实现)
AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改 t个样例,n个单词,一个文本串,求文本串中单词出现的次数. 若给出单词ab,ab 文本ab,匹配数为2 若给出 n个不重复的单 ...
- HDU 2222(AC自动机模板)
AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...
- HDU 6208 AC自动机 或 暴力?
简略题意:问是否存在一个串,其他串都是他的子串. 看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了. 有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配.如果匹配到了所有串 ...
最新文章
- 基于运动信息的物体检测(背景差分法、帧间差分法和光流法)。
- 「轻松支付,只需几步」使用 LeanCloud 云代码接入支付宝示例
- 东芝发布15nm SG5固态硬盘 容量高达1TB
- 手动编写第一个javaWEB文件
- Spring MVC-09循序渐进之文件上传(基于Servlet3.0+Html5客户端上传文件)
- 老王Python-进阶篇4-面向对象第三节
- boost::fibers::algo::shared_work >用法的测试程序
- 2018暑假集训---递推递归----一只小蜜蜂hdu2044
- php文件锁解锁是删除对应的文件_软件 | 文件解锁强制删除工具 Wise Force Deleter v1.49...
- Standard C Episode 1
- Python多人聊天室
- Unity3D 《坦克大战》案例源码过程
- 最短路——迪杰斯特拉算法
- 1 Yocto 项目分析和跟踪手册
- C++11 使用智能指针封装 pimpl idom
- 【11】Activity的生命周期
- 【QT数字图像处理】(三)QSlider滑块学习
- 飞腾cpu服务器浪潮信息,推动国产化进程 浪潮发布飞腾服务器
- python 根号化简_Python 基础
- 【Node.js】深度解析node的包和强大的包管理工具