全文检索

全文检索

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1048    Accepted Submission(s): 324

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]

题目大意:给定一段长数字串和一组短的数字串,问哪些短串在长串中出现过。

Trie  树

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <string>
  7 #include <vector>
  8 #include <stack>
  9 #include <queue>
 10 #include <set>
 11 #include <map>
 12 #include <iomanip>
 13 #include <cstdlib>
 14 using namespace std;
 15 const int INF=0x5fffffff;
 16 const int MS=100005;
 17 const double EXP=1e-8;
 18
 19 struct node
 20 {
 21      int id;
 22     //bool have;
 23     node * next[10];
 24 }nodes[MS*10];   //注意这个大小  尽量大一点
 25
 26 node *root;
 27 bool flag;
 28 int cnt;
 29
 30 char text[MS];
 31 char key[100];
 32 bool mark[MS/10];
 33 node * add_node(int c)
 34 {
 35     node *p=&nodes[c];
 36     for(int i=0;i<10;i++)
 37         p->next[i]=NULL;
 38    // p->have=false;
 39     p->id=-1;
 40     return p;
 41 }
 42
 43 void insert(char *str,int no)
 44 {
 45     node *p=root,*q;
 46     int len=strlen(str);
 47     for(int i=0;i<len;i++)
 48     {
 49         int id=str[i]-‘0‘;
 50         if(p->next[id]==NULL)
 51         {
 52             q=add_node(cnt++);
 53             p->next[id]=q;
 54         }
 55         p=p->next[id];
 56     }
 57     p->id=no;
 58 }
 59 void search(char *str)
 60 {
 61     node *p=root;
 62     int len=strlen(str);
 63     for(int i=0;i<len;i++)
 64     {
 65         int id=str[i]-‘0‘;
 66         p=p->next[id];
 67         if(p==NULL)
 68             return ;
 69         if(p->id!=-1&&mark[p->id]==false)
 70         {
 71             if(!flag)
 72             {
 73                 printf("Found key: [Key No. %d]",p->id);
 74                 flag=true;
 75                 mark[p->id]=true;
 76             }
 77             else
 78             {
 79                 printf(" [Key No. %d]",p->id);
 80                 mark[p->id]=true;
 81             }
 82         }
 83     }
 84 }
 85
 86 int main()
 87 {
 88     int n,m,i,j,k=0;
 89     scanf("%d %d",&n,&m);
 90     char tstr[MS/100];
 91     flag=false;
 92     memset(mark,false,sizeof(mark));
 93     cnt=0;
 94     root=add_node(cnt++);
 95     for(i=0;i<n;i++)
 96     {
 97         scanf("%s",tstr);
 98         int len=strlen(tstr);   //用strcat更好。
 99         for(j=0;j<len;j++)
100             text[k++]=tstr[j];
101     }
102     text[k]=‘\0‘;
103     //getchar();  //可以加也可以不加,因为scanf()可以跳过换行符
104     for(i=0;i<m;i++)
105     {
106         scanf("%s%s%s%s",tstr,tstr,tstr,key);
107         insert(key,i+1);
108     }
109     for(i=0;i<k-4;i++)
110     {
111         search(text+i);
112     }
113     if(!flag)
114         printf("No key can be found !\n");
115     else
116         printf("\n");
117     return 0;
118 }
时间: 2024-11-05 10:33:22

全文检索的相关文章

Solr_全文检索引擎系统

Solr介绍: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中. Solr的作用: solr是一个现成的全文检索引擎系统, 放入tomcat下可以独立运行, 对外通过http协议提供全文检索服务(就是对索引和文档的增删改查服务), 在代码中可以通过solrJ(solr的客户端的jar包)来调用solr服务. Lucene和solr的区别: lucene是一个全文检索引擎工

全文检索技术---Lucene

1       Lucene介绍 1.1   什么是Lucene Lucene是apache下的一个开源的全文检索引擎工具包.它为软件开发人员提供一个简单易用的工具包(类库),以方便的在目标系统中实现全文检索的功能. 1.2   全文检索的应用场景 1.2.1  搜索引擎 ©注意: Lucene和搜索引擎是不同的,Lucene是一套用java或其它语言写的全文检索的工具包.它为应用程序提供了很多个api接口去调用,可以简单理解为是一套实现全文检索的类库.搜索引擎是一个全文检索系统,它是一个单独运

全文检索技术---solr

1       Solr介绍 1.1   什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中. Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引.搜索性能进行了优化. 使用Solr 进行创建索引和搜索索引的实现方法很简单,如下: l  创建索引:客户端(可以是浏览器可以是Java程序)用 POST 方法向 Solr 服务器发

RDS MySQL 全文检索相关问题的处理

RDS MySQL 全文检索相关问题 1. RDS MySQL 对全文检索的支持 2. RDS MySQL 全文检索相关参数 3. RDS MySQL 全文检索中文支持 3.1 MyISAM 引擎表 3.2 InnoDB 引擎表 4. like '%xxx%' 和全文检索的比较 4.1 like '%xxx%' 4.2 全文检索 5. ft_query_expansion_limit 参数作用 1. RDS MySQL 对全文检索的支持 RDS MySQL 5.5 仅 MyISAM 引擎表支持全

MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持

背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.19 了,所以,一些小的应用可以用它做全文搜索了,像sphinx和Lucene这样偏重的.需要配置或开发的,节省了成本. 这儿有一个原创的Mysql全文搜索的文章, mysql的全文搜索功能:http://blog.csdn.net/bravekingzhang/article/details/672

hdu 1277 全文检索

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1277 全文检索 Description 我们大家经常用google检索信息,但是检索信息的程序是很困难编写的:现在请你编写一个简单的全文检索程序.问题的描述是这样的:给定一个信息流文件,信息完全有数字组成,数字个数不超过60000个,但也不少于60个:再给定一个关键字集合,其中关键字个数不超过10000个,每个关键字的信息数字不超过60个,但也不少于5个:两个不同的关键字的前4个数字是不相同的:由于

HDU 1277 全文检索 (Trie树应用 好题)

全文检索 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1304    Accepted Submission(s): 416 Problem Description 我们大家经常用google检索信息,但是检索信息的程序是很困难编写的:现在请你编写一个简单的全文检索程序. 问题的描述是这样的:给定一个信息流文件,信息完全有数字组成,

Lucene学习总结之一:全文检索的基本原理

一.总论 根据http://lucene.apache.org/java/docs/index.html定义: Lucene是一个高效的,基于Java的全文检索库. 所以在了解Lucene之前要费一番工夫了解一下全文检索. 那么什么叫做全文检索呢?这要从我们生活中的数据说起. 我们生活中的数据总体分为两种:结构化数据和非结构化数据. 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等. 当然有的地方还会提到第三种,半

Lucene:基于Java的全文检索引擎简介 (zhuan)

http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的

【Lucene】Apache Lucene全文检索引擎架构之入门实战

Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻.在Java开发环境里Lucene是一个成熟的免费开源工具.就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库.--<百度百科> 这篇博文主要从两个方面出发,首先介绍一下Lucene中的全文搜索原理,其次通过程序示例来展现如何使用Lucene.关于全文搜索原理部分我上网搜索了一下,也看了好几篇文章,最后在写这篇文