【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 ...
随机推荐
- uva 116 Unidirectional TSP (DP)
uva 116 Unidirectional TSP Background Problems that require minimum paths through some domain appear ...
- js实现键盘操作对div的移动或改变-------Day43
<爸爸去哪儿>的第二季据说要开播了额,有点小期待,不知道这一季的小宝贝们会有多萌,还会甜到心底吧, 哈哈,还记得那个风一样的女子呢,不知道她如今怎样了. 言归正传,继续今天的记录,实际上在 ...
- PHP安全编程:防止源代码的暴露(转)
关于包含的一个重要问题是源代码的暴露.产生这个问题主要原因是下面的常见情况: 对包含文件使用.inc的扩展名 包含文件保存在网站主目录下 Apache未设定.inc文件的类型 Apache的默认文件类 ...
- 实现nodejs的promises库(基于promise.js改写)
原promise.js库地址:https://github.com/stackp/promisejs promises是JavaScript实现优雅编程的一个非常不错的轻量级框架.该框架可以让你从杂乱 ...
- Java基础知识强化之集合框架笔记12:Collection集合存储字符串并遍历
1. Collection集合存储字符串并遍历 分析: (1)创建集合对象 (2)创建字符串对象 (3)把字符串对象添加到集合中 (4)遍历集合 2. 代码示例: package cn.itcast ...
- HUD 2444 The Accomodation of Students (二分图染色+最大匹配)
#include<iostream> #include<cstdio> #include<cstring> #define maxn 2010 using name ...
- 错误记录--关于foreach,集合已修改;可能无法执行枚举操作
集合已修改,可能无法执行枚举操作.今天在使用foreach遍历的时候出现了这样的错误.查了一下,这个是使用foreach的典型的错误问题问题.foreach在遍历取数据的过程中,枚举器只允许读,不允许 ...
- Python 函数的使用 外加引入文件
#coding=utf-8 #!user/bin/python import sys import test2 def functionsss(name,sex,age=25): print name ...
- 数据逆向传递 unwind segue
一.简介 unwind segue通过允许你定义一个控制器和其他控制器的关系来扩展segue的概念,这个“关系”先于顺传(流式控制)的方式.基于unwind segue可以实现导航相反的效果,即将界面 ...
- ASP.NET Core中使用Razor视图引擎渲染视图为字符串
一.前言 在有些项目需求上或许需要根据模板生产静态页面,那么你一样可以用Razor语法去直接解析你的页面从而把解析的页面生成静态页,这样的使用场景很多,不限于生成静态页面,视图引擎为我们提供了模型到视 ...