HDU 2222 AC自动机模板题

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222

AC自动机模板题

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 char key[55];
 6 char des[1111111];
 7 struct node{
 8     node *fail;
 9     node *next[26];
10     int cnt;
11     node(){
12         fail = NULL;
13         cnt = 0;
14         for(int i = 0;i<26;i++)
15             next[i] = NULL;
16     }
17 };
18 node *root;
19 void insert(char *str){
20     node *head = root;
21     int len = strlen(str);
22     for(int i = 0;i<len;i++){
23         int temp = str[i]-‘a‘;
24         if(head->next[temp] == NULL)
25             head->next[temp] = new node();
26         head = head->next[temp];
27     }
28     head->cnt++;
29 }
30 void build(){
31     queue<node *>q;
32     q.push(root);
33     while(!q.empty()){
34         node *head = q.front();
35         q.pop();
36         for(int i = 0;i<26;i++){
37             if(head->next[i] != NULL){
38                 if(head == root){
39                     head->next[i]->fail = root;
40                 }else{
41                     node *temp = head->fail;
42                     while(temp != NULL){
43                         if(temp->next[i] != NULL){
44                             head->next[i]->fail = temp->next[i];
45                             break;
46                         }
47                         temp = temp->fail;
48                     }
49                     if(temp == NULL)
50                         head->next[i]->fail = root;
51                 }
52                 q.push(head->next[i]);
53             }
54         }
55     }
56 }
57 int query(){
58     int len = strlen(des),ans = 0;;
59     node *head = root;
60     for(int i = 0;i<len;i++){
61         int index = des[i]-‘a‘;
62         while(head->next[index] == NULL && head != root)
63             head = head->fail;
64         head = head->next[index];
65         if(head == NULL)
66             head = root;
67         node *temp = head;
68         while(temp!=root && temp->cnt!=-1){
69             ans += temp->cnt;
70             temp->cnt = -1;
71             temp = temp->fail;
72         }
73     }
74     return ans;
75 }
76 int main(){
77     int t;
78     scanf("%d",&t);
79     while(t--){
80         root = new node();
81         int n;
82         scanf("%d",&n);
83         for(int i = 0;i<n;i++){
84             scanf(" %s",key);
85             insert(key);
86         }
87         build();
88         scanf(" %s",des);
89         printf("%d\n",query());
90     }
91     return 0;
92 }
时间: 2024-10-13 02:35:49

HDU 2222 AC自动机模板题的相关文章

hdu 2222 AC自动机(模板题)

<题目链接> 题目大意: 给你一些单词,和一个字符串,问你这个字符串中含有多少个上面的单词. 解题分析: 这是多模匹配问题,如果用KMP的话,对每一个单词,都跑一遍KMP,那么当单词数量非常多的时候,耗时会非常多,所以这里用到了AC自动机,这是一种类似于Trie树的数据结构,但是同时,它也用到了KMP算法中 next数组的思想. 下面是AC自动机指针形式的题解: #include <stdio.h> #include <stdlib.h> #include <st

HDU 3065 (AC自动机模板题)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模式串,且每种模式串出现了多少次. 解题思路: AC自动机模板题.模式串的范围是大写字母,但是匹配串的范围却是(0~127). 如果Trie 开到 128 加上不回收内存,就会MLE. 实际上开到26就行了,find的时候对于c<0||c>26,强制令pos=root出现失配,并开始下一个字符就行了

HDU 2896 (AC自动机模板题)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串. 解题思路: AC自动机模板题.注意一下字符范围. cnt记录这个模式串的个数改为这个模式串的index. find的时候,把找到的index压入vector里面即可. 注意有多个匹配串,每次find之后会把last->cnt修改,原因是防止一个模式串出现了多次被压入vector,所以先备份一下,

HDU 2222 AC自动机(模版题)

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 70290    Accepted Submission(s): 23917 Problem Description In the modern time, Search engine came into the life of everybody lik

HDU 2222(AC自动机模板题)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题思路: AC自动机模板题. 一开始使用LRJ的坑爹静态模板,不支持重复的模式串. 在做AC自动机+DP的时候,扒了zcwwzdjn大神的动态优化(失配指向root)写法,以及借鉴了网上的AC自动机模板, 搞出了这么一个支持重复串的模板. #include "cstdio" #include

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

原题大意:原题链接 先给定T个单词,然后给定一个字符串,查询该字符串中包含多少个给定的单词 解题思路:AC自动机模板题 参考链接:哔哩哔哩算法讲堂 WA版本 注意:因为输入的单词可能有重复,那么Insert()函数中p->id=id;语句中p->id会被覆盖,在Query()函数中会一次性全部被清零,导致不能查询重复单词,以至于结果res错误. #include<queue> #include<cstdio> #include<cstring> using

hdu5384 AC自动机模板题,统计模式串在给定串中出现的个数

http://acm.hdu.edu.cn/showproblem.php?pid=5384 Problem Description Danganronpa is a video game franchise created and developed by Spike Chunsoft, the series' name is compounded from the Japanese words for "bullet" (dangan) and "refutation&q

LA 4670 出现次数最多的子串 (AC自动机模板题)

Dominating Patterns Time Limit:3000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu [Submit]  [Go Back]  [Status] Description The archaeologists are going to decipher a very mysterious ``language". Now, they know many language patterns; ea

NYOJ 1085 数单词 (AC自动机模板题)

数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级,可是没想到,成绩出来以后,居然没有通过.所以他不得不付出更多的时间来学习英语. 要想通过六级,最基本的要求就是词汇量.为了能够更快的记住一些陌生单词,LYH有时会找一些英语文章来读. 今天早上,LYH又找了一篇文章.读之前,他突然萌生出一个想法:文章中哪些单词出现的次数最多呢? 输入 第一行输入一个