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 全文检索的更多相关文章

  1. hdu 1277 全文检索

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1277 全文检索 Description 我们大家经常用google检索信息,但是检索信息的程序是很困难 ...

  2. HDU 1277全文检索(字典树)

    全文检索 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. hdu 1277 全文检索 (直接映射查找 || 自动机)

    Problem - 1277 无聊做水题的时候发现的一道题目.这道题第一反应可以用自动机来解决.当然,条件是各种限制,从而导致可以用直接映射标记的方法来搜索.具体的做法就像RK算法一样,将字符串has ...

  4. hdu 1277 全文检索 (字典树应用)

    全文检索 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. Trie(字典树)解析及其在编程竞赛中的典型应用举例

    摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...

  6. Solr_全文检索引擎系统

    Solr介绍: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中. Solr ...

  7. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  9. HDOJ 1326. Box of Bricks 纯水题

    Box of Bricks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

随机推荐

  1. x64位windows上程序开发的注意事项

    在Windows上面32位与64位的区别有: 1.指针大小的区别,sizeof(int *)在32bit下面是4个字节,在64bit下面是8个字节 2.size_t的区别,size_t在32bit下面 ...

  2. [PWA] 6. Hijacking response

    For example, if the url is not match to any API endpoint, we want to return 404 error message. So fi ...

  3. QT程序库

      实际上,QT不仅仅是一个巨大的程序库,而是7个程序库,还包括许多使用工具,qmake是其中的一个.如今,术语GUI工具包代表的东西的用途不再仅仅是系统提供的那么一个小部分(GUI界面).尤其是QT ...

  4. Linux后台开发面试问题汇总

    个人从事安全后台开发,当然是linux环境下的了.举几个常见的问题.1. 数据结构基础.比如实现一个最简单的哈希表.2. 操作系统基础.linux进程模型,堆/栈的区别,大概的位置,各往哪个方向生长, ...

  5. NSIndexPath初始化

    在UITableView中经常用到这个类,但一直不知道怎么初始化,网上抄录的代码如下,果然好用 NSIndexPath *index = [NSIndexPath indexPathForRow:0 ...

  6. Eclipse快捷键 10个最有用的快捷键(转)

    Eclipse中10个最有用的快捷键组合  一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升.    ...

  7. POJ 3162 Walking Race(树的直径+单调队列)

    题目大意:对一棵树,求出从每个结点出发能到走的最长距离(每个结点最多只能经过一次),将这些距离按排成一个数组得到dis[1],dis[2],dis[3]……dis[n] ,在数列的dis中求一个最长的 ...

  8. 大牛对ACM入门菜鸟的一些话

    首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门.其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发现我有很多的东西要学的时候,我实 ...

  9. Web开发 < base target>

    target就是点击链接后跳转到的目标页.通俗点说,就是你当前页面上的链接<a>,也包括<img>.<link>.<form>,除非你指定了target ...

  10. animation的6个属性

    @keyframes 规定动画.   animation 所有动画属性的简写属性,除了 animation-play-state 属性.   animation-name 规定 @keyframes ...