全文检索
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2239    Accepted Submission(s): 761

Problem Description
我们大家经常用google检索信息,但是检索信息的程序是很困难编写的;现在请你编写一个简单的全文检索程序。
问题的描述是这样的:给定一个信息流文件,信息完全有数字组成,数字个数不超过60000个,但也不少于60个;再给定一个关键字集合,其中关键字个数不超过10000个,每个关键字的信息数字不超过60个,但也不少于5个;两个不同的关键字的前4个数字是不相同的;由于流文件太长,已经把它分成多行;请你编写一个程序检索出有那些关键字在文件中出现过。

Input
第一行是两个整数M,N;M表示数字信息的行数,N表示关键字的个数;接着是M行信息数字,然后是一个空行;再接着是N行关键字;每个关键字的形式是:[Key No. 1] 84336606737854833158。

Output
输出只有一行,如果检索到有关键字出现,则依次输出,但不能重复,中间有空格,形式如:Found key: [Key No. 9] [Key No. 5];如果没找到,则输出形如:No key can be found !。

Sample Input
20 10
646371829920732613433350295911348731863560763634906583816269
637943246892596447991938395877747771811648872332524287543417
420073458038799863383943942530626367011418831418830378814827
679789991249141417051280978492595526784382732523080941390128
848936060512743730770176538411912533308591624872304820548423
057714962038959390276719431970894771269272915078424294911604
285668850536322870175463184619212279227080486085232196545993
274120348544992476883699966392847818898765000210113407285843
826588950728649155284642040381621412034311030525211673826615
398392584951483398200573382259746978916038978673319211750951
759887080899375947416778162964542298155439321112519055818097
642777682095251801728347934613082147096788006630252328830397
651057159088107635467760822355648170303701893489665828841446
069075452303785944262412169703756833446978261465128188378490
310770144518810438159567647733036073099159346768788307780542
503526691711872185060586699672220882332373316019934540754940
773329948050821544112511169610221737386427076709247489217919
035158663949436676762790541915664544880091332011868983231199
331629190771638894322709719381139120258155869538381417179544
000361739177065479939154438487026200359760114591903421347697

[Key No. 1] 934134543994403697353070375063
[Key No. 2] 261985859328131064098820791211
[Key No. 3] 306654944587896551585198958148
[Key No. 4] 338705582224622197932744664740
[Key No. 5] 619212279227080486085232196545
[Key No. 6] 333721611669515948347341113196
[Key No. 7] 558413268297940936497001402385
[Key No. 8] 212078302886403292548019629313
[Key No. 9] 877747771811648872332524287543
[Key No. 10] 488616113330539801137218227609

Sample Output
Found key: [Key No. 9] [Key No. 5]

思路:将要查询是否存在的串建树,用vis一边记录下标一边作为尾结点的标记,通过更换起始节点依次查询信息流数字串;

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int t[600001][11],vis[600001], pos = 1;
char temp[10000], s[61111];
void insert(char p[], int i)
{int rt = 0;for (int i = 0; p[i]; i++){int x = p[i] - '0';if (t[rt][x] == 0)t[rt][x] = pos++;rt = t[rt][x];}vis[rt] = i;//既是标记又存入了序号
}
void search(char *p)
{int rt = 0;for (int i = 0; p[i]; i++){int x = p[i] - '0';if (rt && vis[rt]){printf(" [Key No. %d]", vis[rt]);vis[rt] = 0;}if (t[rt][x] == 0)//若下一个节点不存在树上,直接返回return;rt = t[rt][x];//下一个节点对应下一个字符}
}
int main()
{int m, n;scanf("%d%d", &m, &n);int k = 0;for (int i = 0; i < m; i++){scanf("%s", temp);for (int j = 0; temp[j]; j++)s[k++] = temp[j];//把所有输入的字符串合并}//printf("\n");for (int i = 1; i <= n; i++){scanf("%s", temp);scanf("%s", temp);scanf("%s", temp);scanf("%s", temp);//消除前几个字符,只取后面的一串数字insert(temp, i);}printf("Found key:");for (int i = 0; s[i]; i++)search(s + i);printf("\n");return 0;
}

转载于:https://www.cnblogs.com/aeipyuan/p/9893124.html

HDU 1277全文检索(字典树)相关推荐

  1. hdu 1251+hdu 1671(字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 一开始我是直接用STL做的,唉...没有经验那...orz...然后毫无疑问地超时了... 看别 ...

  2. hdu 1075 (字典树映射)

    /*问题:输入一段英文,对照给的单词的映射,输出映射后的字符串YY :典型的字典树问题,先处理好映射表,在一映射单词结尾处记录与之对应的单词,后面字符串处理一下,单个单词进行查,找到后输出,没有输出原 ...

  3. 单词数 HDU - 2072(字典树模板题amp;stl)

    lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input 有多组数据,每组一行,每组就 ...

  4. hdu 5687 裸字典树

    度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: 查询是否 ...

  5. 单词数 HDU - 2072 纯字典树个人理解

    lily的好朋友xiaoou333最近很空, 他想了一件没有什么意义的事情, 就是统计一篇文章里不同单词的总数. 下面你的任务是帮助xiaoou333解决这个问题. Input有多组数据,每组一行,每 ...

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

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

  7. [ACM] hdu 1671 Phone List (字典树)

    [ACM] hdu 1671 Phone List (字典树) Phone List Problem Description Given a list of phone numbers, determ ...

  8. hdu 1251 统计难题(字典树)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 分析: 关于字典树的题目似乎都有一个普通适用性的模板,有时只是稍加改动来满足临时的要求,我的一 ...

  9. HDU多校1 - 6955 Xor sum(字典树+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,要求找到一段长度最短的区间,使得异或和大于等于 kkk,如果有多种答案,输出左端点最小的那个 题目分析:倒着维护一下后缀异或和,将后缀异或 ...

  10. HDU - 1251 统计难题(字典树)

    题目链接:点击查看 题目大意:给出一些单词,后续再给出一些前缀,询问包含此前缀的单词一共有多少个 题目分析:这个题目的数据可能有点水,而且时间给的也很足,给了两秒,而且加上是hdu的,可以用无序map ...

最新文章

  1. 多个线程为了同个资源打起架来了,该如何让他们安分?
  2. Vitamio打造自己的Android万能播放器
  3. 【专栏原创]】忘掉一切,从用户场景出发——我在需求上犯过的错
  4. HTTP/3 来啦,你还在等什么?赶紧了解一下
  5. VTK:旋转球体用法实战
  6. numpy 是否为零_一文看懂Numpy统计计算、数组比较
  7. YbtOJ#493-最大分数【斜率优化dp,分治】
  8. Linux Socket API Connect 函数详解
  9. 法那科机器人初始化启动_发那科机器人的控制方式和控制柜的启动方式
  10. django 学习 (四) 模板标签
  11. 面试系列第1篇:常见面试题和面试套路有哪些?
  12. java功夫手机游戏6_我功夫贼六手游下载
  13. 仓库码放要求_仓储管理的全流程SOP操作示范,你们公司仓库管理规范吗?
  14. css hack 尽我所见
  15. Golang语言 零基础入门教程
  16. Laravel 结合TCPDF生成PDF
  17. 从 0 搭建 Vite 3 + Vue 3 前端工程化项目
  18. linux无线网卡创建ap,Linux中使用hostapd创建无线AP及相关问题的处理方法
  19. wamp5 开启 ssl
  20. Windows键盘快捷方式

热门文章

  1. 数据结构与算法之美-问题与思考收集
  2. vs 发生错误,需要终止调试... HRESULT=0x8000ffff。ErrorCode=0x0 解决办法
  3. r语言t检验输出检验统计量_R语言:常用统计检验
  4. Mtalab 空间直线和球形的交点以及图像绘制
  5. mysql入侵服务器_记通过mysql数据库成功入侵到服务器内部的渗透实战
  6. java mission control_Java Mission Control之使用
  7. listview嵌套edittext,决解数据无法保存
  8. 客户分段模型(Customer Segmentation Models)
  9. Mandriva linux 资源列表
  10. ARM920T及其MMU,Cache学习杂记(一)