HDU2222 Keywords Search__AC自动机
| Time Limit: 1000MS | Memory Limit: 131072KB | 64bit IO Format: %I64d & %I64u |
Description
Wiskey also wants to bring this feature to his image retrieval system.
Every image have a long description, when users type some keywords to find the image, the system will match the keywords with description of image and show the image which the most keywords be matched.
To simplify the problem, giving you a description of image, and some keywords, you should tell me how many keywords will be match.
Input
Each case will contain two integers N means the number of keywords and N keywords follow. (N <= 10000)
Each keyword will only contains characters 'a'-'z', and the length will be not longer than 50.
The last line is the description, and the length will be not longer than 1000000.
Output
Sample Input
5
she
he
say
shr
her
yasherhs
Sample Output
1 struct node
2 {
3 node * fail;
4 node * next[kind];
5 int count;
6 node ()
7 {
8 fail=NULL;
9 memset(next,NULL,sizeof(next));
10 count=0;
11 }
12 };
二:建立失败指针。
失败指针分为三类:
1、root的失败指针指向NULL
2、root孩子的失败指针指向root
3、其余节点的失败指针按照以下方法:沿该节点的父亲节点的失败指针查找同样有该节点的节点,把该节点的失败指针指向那个节点的该节点。如果找不到则指向root。如:该节点(1)为‘a',而该节点的父亲节点(2)为’c',则查找'c'的失败指针指向的节点(3),当然节点(3)也为’c',如果节点(3)有’a'这个孩子(节点(4)),则把节点(1)的失败指针指向节点(4),如果节点(3)没有‘a'这个孩子,则沿着沿的失败指针继续查找,直到NULL。则把失败指针指向root。
建立的方法:
由于1、2类节点的失败指针一定,而第3指针是沿着父亲的失败指针查找,所以用队列维护指针。
1 void buildac(node * root)
2 {
3 int i;
4 root->fail=NULL;
5 q.push(root);
6 while(!q.empty())
7 {
8 node *tp=q.front(),*p;
9 q.pop();
10 for(int i=0;i<26;i++)
11 {
12 if(tp->next[i]!=NULL)
13 {
14 if(tp==root)tp->next[i]->fail=root;
15 else
16 {
17 p=tp->fail;
18 while(p!=NULL)
19 {
20 if(p->next[i]!=NULL)
21 {
22 tp->next[i]->fail=p->next[i];
23 break;
24 }
25 p=p->fail;
26 }
27 if(p==NULL)tp->next[i]->fail=root;
28 }
29 q.push(tp->next[i]);
30 }
31 }
32 }
33 }
三、查询。
查询方法:指针p指向root,沿着主串的字母走,如果该节点没法走则跳到失败指针再走,如果还不能走则再跳直到到达root。如果某一个点匹配成功则沿失败指针统计对应失败指针的count。
int query(node *root)
{
int i=0,cnt=0,index;
node *p=root;
while(s[i])
{
index=s[i]-'a';
while(p->next[index]==NULL && p!=root)p=p->fail;
p=(p->next[index]==NULL)?root:p->next[index];
node *tp=p;
while(tp!=root && tp->count!=-1)
{
cnt+=tp->count;
tp->count=-1;
tp=tp->fail;
}
i++;
}
return cnt;
}
1 #include<cstdio>
2 #include<cstring>
3 #include<queue>
4
5 using namespace std;
6 const int kind=26;
7 struct node
8 {
9 node * fail;
10 node * next[kind];
11 int count;
12 node ()
13 {
14 fail=NULL;
15 memset(next,NULL,sizeof(next));
16 count=0;
17 }
18 };
19 typedef node * np;
20 queue<np>q;
21 char keyw[52],s[1000010];
22 node * root=NULL;
23 int t,n;
24 void ins(char s[],node *root)
25 {
26 node *p=root;
27 int i=0,index;
28 while(s[i])
29 {
30 index=s[i]-'a';
31 if(!p->next[index])p->next[index]=new node;
32 p=p->next[index];
33 i++;
34 }
35 p->count++;
36 }
37 void buildac(node * root)
38 {
39 int i;
40 root->fail=NULL;
41 q.push(root);
42 while(!q.empty())
43 {
44 node *tp=q.front(),*p;
45 q.pop();
46 for(int i=0;i<26;i++)
47 {
48 if(tp->next[i]!=NULL)
49 {
50 if(tp==root)tp->next[i]->fail=root;
51 else
52 {
53 p=tp->fail;
54 while(p!=NULL)
55 {
56 if(p->next[i]!=NULL)
57 {
58 tp->next[i]->fail=p->next[i];
59 break;
60 }
61 p=p->fail;
62 }
63 if(p==NULL)tp->next[i]->fail=root;
64 }
65 q.push(tp->next[i]);
66 }
67 }
68 }
69 }
70
71 int query(node *root)
72 {
73 int i=0,cnt=0,index;
74 node *p=root;
75 while(s[i])
76 {
77 index=s[i]-'a';
78 while(p->next[index]==NULL && p!=root)p=p->fail;
79 p=p->next[index];
80 p=(p==NULL)?root:p;
81 node *tp=p;
82 while(tp!=root && tp->count!=-1)
83 {
84 cnt+=tp->count;
85 tp->count=-1;
86 tp=tp->fail;
87 }
88 i++;
89 }
90 return cnt;
91 }
92 int main()
93 {
94 scanf("%d",&t);
95 while(t--)
96 {
97 root=new node;
98 scanf("%d",&n);
99 while(n--)
100 {
101 scanf("%s",keyw);
102 ins(keyw,root);
103 }
104 buildac(root);
105 scanf("%s",s);
106 printf("%d\n",query(root));
107 }
108 return 0;
109 }
HDU2222 Keywords Search__AC自动机的更多相关文章
- HDU2222 Keywords Search 【AC自动机】
HDU2222 Keywords Search Problem Description In the modern time, Search engine came into the life of ...
- hdu2222 Keywords Search ac自动机
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2222 题目: Keywords Search Time Limit: 2000/1000 MS ...
- HDU2222 Keywords Search [AC自动机模板]
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- HDU2222 Keywords Search(AC自动机)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- hdu2222 Keywords Search【AC自动机】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- 【AC自动机】hdu2222 Keywords Search
AC自动机模板题,给你n个模式串和一个文本串,问你有几个模式串在文本串出现过. 注意防止重复统计 这里推荐一波郭大爷的介绍,简单易懂. http://www.bilibili.com/video/av ...
- HDU2222 Keywords Search —— AC自动机
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 Keywords Search Time Limit: 2000/1000 MS (Java/O ...
- AC自动机讲解+[HDU2222]:Keywords Search(AC自动机)
首先,有这样一道题: 给你一个单词W和一个文章T,问W在T中出现了几次(原题见POJ3461). OK,so easy~ HASH or KMP 轻松解决. 那么还有一道例题: 给定n个长度不超过50 ...
- HDU-2222 Keywords Search 字符串问题 AC自动机
题目链接:https://cn.vjudge.net/problem/HDU-2222 题意 给一些关键词,和一个待查询的字符串 问这个字符串里包含多少种关键词 思路 AC自动机模版题咯 注意一般情况 ...
随机推荐
- 阿里技术专家详解 Dubbo 实践,演进及未来规划
Dubbo 整体介绍 Dubbo 是一款高性能,轻量级的 Java RPC 框架.虽然它是以 Java 语言来出名的,但是现在我们生态里面已经有 Go.Python.PHP.Node.JS 等等语言. ...
- 自定义ClassLoader的使用
1 import java.io.ByteArrayOutputStream; 2 import java.io.File; 3 import java.io.FileInputStream; 4 i ...
- WebService的开发手段
一.WebService的开发手段 目前有关webService的开发手段有2种 1.JDK开发(jdk必须是1.6及以上版本,因为jdk是在1.6版本中引入并支持webservice开发的); 2. ...
- Java中jna的用法
(1)jna是对jni的封装,让java使用者能更好的使用本地的动态库 (2)使用jna需要下载jna的jar包,该jar包就是对jni的封装,所以在调用效率上来讲,jna是要比jni低一点的,不过对 ...
- [论文阅读笔记] node2vec Scalable Feature Learning for Networks
[论文阅读笔记] node2vec:Scalable Feature Learning for Networks 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 由于DeepWal ...
- 解决FastJson循环引用的问题
temp 本来被循环引用,运行方法报错. 解决方法:对temp进行处理 SerializerFeature feature = SerializerFeature.DisableCircularRef ...
- 建立索引和创建视图(结合YGGL.sql)
一.请按要求对YGGL库建立相关索引 (1)使用create index 语句创建索引 1.对employees表中的员工部门号创建普通索引depart_ind. mysql> create i ...
- Angular入门到精通系列教程(4)- 开发环境搭建以及入手项目
1. 本地开发环境搭建 1.1. node.js 1.2. Angular CLI 2. 开发工具 - Visual Studio Code 第一个Anuglar项目 创建第一个anuglar项目 A ...
- HP PROLIANT DL388 GEN10 (故障3019)SPP损坏
HP PROLIANT DL388 GEN10 (故障3019)SPP损坏 1. 开机硬件自检,提示错误ERROR 3019: 2. 根据服务器版本GEN10下载最新固件SPP,可找服务商或者HP售后 ...
- Flutter 基础组件:状态管理
前言 一个永恒的主题,"状态(State)管理",无论是在React/Vue(两者都是支持响应式编程的Web开发框架)还是Flutter中,他们讨论的问题和解决的思想都是一致的. ...