【HDOJ】1277 全文检索
AC自动机,静态数组,动态分配TLE。
/* 1277 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std; #define MAXL 60005
#define TRIEN 10 typedef struct Trie {
int n;
Trie *fail;
Trie *next[TRIEN];
} Trie; Trie tries[];
int nTrie;
char s[MAXL];
char str[];
int ans[], n;
bool flag;
Trie *root; Trie *newNode() {
memset(tries[nTrie].next, , sizeof(tries[nTrie].next));
tries[nTrie].n = ;
tries[nTrie].fail = NULL;
return &tries[nTrie++];
} void create(char str[], int v) {
int i = , id;
Trie *p = root, *q; while (str[i]) {
id = str[i] - '';
++i;
if (p->next[id] == NULL) {
q = newNode();
p->next[id] = q;
}
p = p->next[id];
}
p->n = v;
} void build_fail() {
int i;
Trie *p, *q;
queue<Trie *> Q; for (i=; i<TRIEN; ++i) {
if (root->next[i]) {
root->next[i]->fail = root;
Q.push(root->next[i]);
}
} while (!Q.empty()) {
p = Q.front();
Q.pop();
for (i=; i<TRIEN; ++i) {
if (p->next[i]) {
q = p->fail;
while (q) {
if (q->next[i]) {
p->next[i]->fail = q->next[i];
break;
}
q = q->fail;
}
if (q == NULL)
p->next[i]->fail = root;
Q.push(p->next[i]);
}
}
}
} void search(char s[]) {
int i = , id;
Trie *p = root, *q; while (s[i]) {
id = s[i] - '';
++i;
while (p->next[id]==NULL && p!=root)
p = p->fail;
p = p->next[id];
if (p == NULL)
p = root;
q = p;
while (q != root) {
if (q->n) {
flag = true;
ans[n++] = q->n;
q->n = ;
}
q = q->fail;
}
}
} void del(Trie *t) {
if (t == NULL)
return ;
for (int i=; i<TRIEN; ++i)
del(t->next[i]);
free(t);
} void init() {
n = ;
flag = false;
nTrie = ;
root = newNode();
} int main() {
int t, m;
int i, j, k; #ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
#endif while (scanf("%d %d", &t, &m) != EOF) {
for (i=; i<t; ++i) {
scanf("%s%*c", str);
strcat(s, str);
}
getchar();
init();
for (i=; i<=m; ++i) {
scanf("%*s %*s %*s %s", str);
create(str, i);
}
build_fail();
search(s);
if (flag) {
printf("Found key:");
for (i=; i<n; ++i)
printf(" [Key No. %d]", ans[i]);
printf("\n");
} else {
printf("No key can be found !\n");
}
} return ;
}
【HDOJ】1277 全文检索的更多相关文章
- hdu 1277 全文检索
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1277 全文检索 Description 我们大家经常用google检索信息,但是检索信息的程序是很困难 ...
- HDU 1277全文检索(字典树)
全文检索 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu 1277 全文检索 (直接映射查找 || 自动机)
Problem - 1277 无聊做水题的时候发现的一道题目.这道题第一反应可以用自动机来解决.当然,条件是各种限制,从而导致可以用直接映射标记的方法来搜索.具体的做法就像RK算法一样,将字符串has ...
- hdu 1277 全文检索 (字典树应用)
全文检索 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- Trie(字典树)解析及其在编程竞赛中的典型应用举例
摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...
- Solr_全文检索引擎系统
Solr介绍: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中. Solr ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDOJ 2317. Nasty Hacks 模拟水题
Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- HDOJ 1326. Box of Bricks 纯水题
Box of Bricks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
随机推荐
- STM8S 独立看门狗配置及使用
//独立看门口的时钟来源 内部低速时钟 128khz 除以2 即64khz //选择 IWDG_Prescaler_128 //64/128 =0.5 khz 2ms周期 #define IWDG_5 ...
- 文字保护纱-Material Design
Ok,关于这个Material Design 都快被说烂了,他被开发者越来越熟悉的程度,却与市场上的单薄身影形成了鲜明的对比,以至于每当我提及Material Design时就像祥林嫂附身一样. 有些 ...
- 使用 Java 配置进行 Spring bean 管理--转
概述 众所周知,Spring 框架是控制反转 (IOC) 或依赖性注入 (DI) 模式的推动因素,而这种推动是通过基于容器的配置实现的.过去,Spring 允许开发人员使用基于 XML 的配置,通过利 ...
- 第四篇:R语言数据可视化之折线图、堆积图、堆积面积图
折线图简介 折线图通常用来对两个连续变量的依存关系进行可视化,其中横轴很多时候是时间轴. 但横轴也不一定是连续型变量,可以是有序的离散型变量. 绘制基本折线图 本例选用如下测试数据集: 绘制方法是首先 ...
- poj 1125 Stockbroker Grapevine (dij优化 0ms)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...
- 使用MiniProfiler调试Asp.net Mvc性能
使用nuget添加MiniProfiler.EF组件 在Global文件中配置MiniProfiler protected void Application_Start() { AreaRegistr ...
- Hql 执行CRUD
//新增] @Test public void add(){ config = new Configuration(); sessionfactory = config.configure(" ...
- LinkButton和HyperLink的页面跳转用法
<%--<asp:HyperLink ID="HyperLink1" NavigateUrl='<%#"/Fxy_Admin/Pro_ClassNew. ...
- Request 获取Url
1.获取页面,HttpContext.Current.Request也是Request //获取当前页面url string myurl = HttpContext.Current.Request.U ...
- (转)PHP正则表达式的快速学习方法
1.入门简介 简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具.我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或 ...