转载自:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html

题意:

t组测试数据,每组有n个单词和一个模式串,问n个单词有多少个在模式串中出现过。

思路:

做的第一道AC自动机模板题。。。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;const int kind=26;//结点有26种,a~z
struct node
{node *fail;//失败指针node *next[kind];int count;node(){fail=NULL;count=0;memset(next,NULL,sizeof(next));}
}*q[500001];//队列用于bfs构造失败指针char keyword[51];//输入的单词
char str[1000001];//模式串
int head,tail;//队列头和尾void insert(char *str,node *root)
{node *p=root;int i=0,index;while(str[i]){index=str[i]-'a';if(p->next[index]==NULL)p->next[index]=new node();p=p->next[index];i++;}p->count++;
}void build_ac(node *root)
{int i;root->fail=NULL;q[head++]=root;while(head!=tail){node *temp=q[tail++];node *p=NULL;for(int i=0;i<26;i++){if(temp->next[i]!=NULL){if(temp==root)temp->next[i]->fail=root;else{p=temp->fail;while(p!=NULL){if(p->next[i]!=NULL){temp->next[i]->fail=p->next[i];break;}p=p->fail;}if(p==NULL)temp->next[i]->fail=root;}q[head++]=temp->next[i];}}}
}int query(node *root)
{int i=0,cnt=0,index,len=strlen(str);node *p=root;while(str[i]){index=str[i]-'a';while(p->next[index]==NULL&&p!=root)p=p->fail;p=p->next[index];p=(p==NULL)?root:p;node *temp=p;while(temp!=root&&temp->count!=-1){cnt+=temp->count;temp->count=-1;temp=temp->fail;}i++;}return cnt;
}int main()
{int t;scanf("%d",&t);while(t--){int n;head=tail=0;node *root=new node();scanf("%d",&n);getchar();while(n--){gets(keyword);insert(keyword,root);}build_ac(root);scanf("%s",str);//printf("%s\n",str);printf("%d\n",query(root));}
}

hdu2222(看一些单词哪些在模式串中出现过)相关推荐

  1. 数据结构——串中kmp算法求模式串中next函数值

    笔记 给定一个模式串,求next[j]值  求解方法: 1.第一位的next值为0 2.第二位的next值为1 后面求解每一位的next值时,根据前一位进行比较 3.第三位的next值:看第二位的模式 ...

  2. 删除主串中模式串出现的字符

    要求:输入一个主串X和模式串Y,要求删除主串X中在模式串Y中出现的所有字符.如:主串X:welcome to tencent. 模式串Y:aeio.则输出结果为:wlcm t tncnt. 思路:最直 ...

  3. 时空权衡在模式匹配算法中的应用(JAVA)--Horspool算法(简化版BM算法)

    模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串.假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题 ...

  4. P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)

    P5357 [模板]AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数) 传送门 形式上,AC 自动机基于由若干模式串构成的 Trie 树,并在此之上增加了一些 fail 边:本质 ...

  5. HDU 4787 在线AC自动机 分块(模式串和母串交叉给出,多次求getFail)

    题意: 给定T个测试数据 n个操作 + 插入单词 ? 询问母串中有多少个子串 在上面出现过 ( 子串被加密,即←移动L位 (L为上次询问的答案) ) 分块思路: 因为模式串和母串交叉给出,正常来说应该 ...

  6. KMP算法求解next数组值(模式串从下标0开始或从下标1开始)以及求值后与主串的匹配过程

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  7. 若S作主串,P作模式串,试分别写出利用BF算法和KMP算法的匹配过程。

    目   录 题目: 百度文库-答案: (1) (2) MOOC标准答案: (1) (2) mooc答案-截图: 数据结构(C语言版)-严蔚敏2007 题目: 设字符串S='aabaabaabaac', ...

  8. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题

    KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...

  9. AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora

    Problem's Link Mean: 有n个模式串和一篇文章,统计有多少模式串在文章中出现(正反统计两次). analyse: 好久没写AC自动机了,回顾一下AC自动机的知识. 本题在构造文章的时 ...

最新文章

  1. 如何用Python做Web开发?——Django环境配置
  2. python拆堆和堆叠的操作_堆叠框架的Python / Tkinter退出按钮
  3. 核磁共振影像数据处理-3-DTI基础、Li‘s have a solution and plan.
  4. python xpath语法-Python xpath表达式如何实现数据处理
  5. 以下输出结果为16的python_作业 -- 几道简单的Python题
  6. 5、优化MySQL服务器
  7. 2022速卖通328大促活动招商规则出炉啦,热销高潜产品抢先看
  8. NAT 及 NAT 打洞技术
  9. JS正则表达式大全(整理详细且实用)
  10. 【CSS3】CSS实现の全屏覆盖+居中显示+等比缩放
  11. IronRuby 发布第一个版本
  12. LinkedHashMap和TreeMap的有序性
  13. 【Oracle】开、关、删归档日志(archivelog)
  14. 洛谷——P1876 开灯
  15. mysql(指RDS)验证pureftpd登录
  16. (译)如何制作一个类似tiny wings的游戏:第二部分(完) - 子龙山人 ...
  17. 2的6次方怎么用计算机,2的6次方是多少(进制转换计算器)
  18. python输出数字三角形_Python|2020蓝桥杯之数字三角形
  19. 软件开发人员的职业发展规划
  20. Python基础知识:def创建函数

热门文章

  1. 量变的一种坏结果是变质——以身说法结合实例论量与质,过程与结果2017-12-20
  2. 解决Sublime Text打开C++文件出现中文乱码
  3. adobe字体_Adobe发布全新LOGO!字体颜色变红了
  4. c++ 编译添加dll_matconvnet安装、编译、配置
  5. VTK修炼之道29:图像统计_彩色直方图计算
  6. VTK修炼之道15:图像处理_显示(vtkImageViewer2 vtkImageActor)
  7. NullPointerException: null 报错
  8. Unicode、UTF-8 和 ISO8859-1到底有什么区别(转载)
  9. 使用 u-boot 烧写内核——韦东山嵌入式Linux学习笔记10
  10. C语言实现通用链表初步(一)