短语搜索

短语搜索

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte

总提交:535            测试通过:170

描述

常见文本编辑器的一个功能是搜索,打开一段英文文字,根据一个给定的英文短语,可以搜索得到这个短语在文章中的位置,短语有可能重复出现。现请求出给定的短语在一段文字中出现的最后一个位置。文字中单词从1开始编号,所求的位置为短语第1个单词在这段文字中对应单词的编号。

输入

多行,每行以 # 为结束,第1行为一段英文文字(单词数、数字不多于500),其余行是待搜索的英文短语(单词数不多于10)。这里英文文字、英文短语只包含英文单词,这些单词以空格分隔。

输出

多行,每一行对应输入中给定的短语在文字中出现的最后一个位置,搜索不到时输出-1。

样例输入

STOCKHOLM April 21 PRNewswire FirstCall Students from St Petersburg State University of IT Mechanics and Optics are crowned the 2009 ACM International Collegiate Programming Contest World Champions in the Stockholm Concert Hall where the Nobel Prizes are presented every year Sponsored by IBM the competition took place today at KTH the Royal Institute of Technology #

STOCKHOLM #

St Petersburg State University of IT Mechanics and Optics #

World Champions #

the #

NUPT #

样例输出

1

8

26

51

-1

题目来源

南京邮电大学计算机学院首届ACM程序设计大赛(2009)

分析:其实对于字符串的处理我有自信的。唯一需要注意的就是细节问题。遥想当年,用C写的多线程下载器,老泪纵横啊。成功的那瞬间,真是顺畅  \(^o^)/

真正写个东西,真的是要分模块,一步一步做,还真就像搭积木一样,底部牢固了,上面才安全。

不过还是感觉做得太慢了。

看到字符串中字符串出现的位置,首推strstr函数,成功返回首次出现的指针,失败回归false。指针嘛,指来指去的我已经很熟悉了。

输入也是一个问题,如果用string的话,空格输入不进去,所以放弃。最后选用char型数组。注意:数组要长一点(老生常谈了!)索性开了个10000。然后用gets输入。

接下去就是判断第几个单词的问题了。简单,用空格判断。原来输入的字符串s一共num1个空格。指针p指向s中首次出现要找的字符串find的位置,求出p指向的字符串有num2个空格。所以输出 num1 - num2 + 1 。(输入的字符串gets(input) ,去除空格和# 得到字符串 find ,方便查找)

最后解决找 "the #" 字符串的问题。因为要找最后一次出现的位置,上循环。

这里犯了一个在以前写多线程下载器时经常犯的错误。

一开始循环这样写的:

while(strstr(p, find) != false)

{

p = strstr(p, find);

}

死循环。

改成:

while(strstr(p+1, find) != false)

{

p = strstr(p+1, find);

}

OK,Bingo!        酷炫の代码 ~

#include<stdio.h>
#include<string.h>

//短语搜索

int main()
{
	char s[10000], input[10000], find[10000];
	char *p;

	gets(s);
	//printf("%s",s);
	while(gets(input))
	{
		int num1=0, num2 =0;
		int i;
		//printf("%s\n",input);
		for(i =0;s[i];i++) //原来多少个空格
		{
			if(s[i] == ' ')
				num1 ++;
		}

		for(i=0;input[i];i++)
		{
			if(input[i] == '#')
				break;
			find[i] = input[i];
		}
		find[i] = '\0';

		p = strstr(s, find);

		if(p == false)
			printf("-1\n");
		else
		{
			while(strstr(p+1, find) != false)
			{
				p = strstr(p+1, find);
			}
			//printf("%s\n",p);
			for(i=0;*(p+i);i++)
			{
				if(*(p+i) == ' ')
					num2 ++;
			}
			printf("%d\n",num1 -num2 + 1);
		}

	}

	return 0;
}

短语搜索,布布扣,bubuko.com

时间: 2024-12-10 19:01:18

短语搜索的相关文章

短语搜索PhraseQuery

package query; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache

短语搜索,高亮搜索

接着上节: http://www.cnblogs.com/spectrelb/p/7977051.html 短语搜索 找出一个属性中的独立单词是没有问题的,但有时候想要精确匹配一系列单词或者短语 . 比如, 我们想执行这样一个查询,仅匹配同时包含 "rock" 和 "climbing" ,并且 二者以短语 "rock climbing" 的形式紧挨着的雇员记录. 为此对 match 查询稍作调整,使用一个叫做 match_phrase 的查询 G

Elasticsearch短语搜索——match_phrase

找出一个属性中的独立单词是没有问题的,但有时候想要精确匹配一系列单词或者短语 . 比如, 我们想执行这样一个查询,仅匹配同时包含 "rock" 和 "climbing" ,并且 二者以短语 "rock climbing" 的形式紧挨着的雇员记录. 为此对 match 查询稍作调整,使用一个叫做 match_phrase 的查询: curl -XGET 'localhost:9200/megacorp/employee/_search?pretty

多短语搜搜索

/* * 该方法基于短语搜索 * 实现了多个短语进行搜素的功能 * */ package query; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene

php+中文分词scws+sphinx+mysql打造千万级数据全文搜索

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能.Sphinx可以非常容易的与SQL数据库和脚本语言集成.当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据.Sphinx创建索引的速度为:创建100万条记录的索引只需3-4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒.Sphinx的

使用 Apache Lucene 搜索文本

好东西 下手绝不留情 转自 http://www.ibm.com/developerworks/cn/opensource/os-apache-lucenesearch/ 简介 Lucene 是一个开源.高度可扩展的搜索引擎库,可以从 Apache Software Foundation 获取.您可以将 Lucene 用于商业和开源应用程序.Lucene 强大的 API 主要关注文本索引和搜索.它可以用于为各种应用程序构建搜索功能,比如电子邮件客户端.邮件列表.Web 搜索.数据库搜索等等.Wi

Lucene搜索方式大合集

package junit; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.math.NumberUtils; import org.apache.lucene.document.Document; import or

elasticsearch搜索类型简介

简单搜索 GET请求非常简单--你能轻松获取你想要的文档.让我们来进一步尝试一些东西,比如简单的搜索! 我们尝试一个最简单的搜索全部员工的请求: GET /megacorp/employee/_search 接下来,让我们搜索姓氏中包含"jake"的员工.要做到这一点,我们将在命令行中使用轻量级的搜索方法.这种方法常被称作查询字符串(query string)搜索,因为我们像传递URL参数一样去传递查询语句: GET /megacorp/employee/_search?q=last_

三 概要模式 2) MR倒排索引、性能分析、搜索干扰词。

二  倒排索引 倒排索引(英语:Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射.它是文档检索系统中最常用的数据结构. 有两种不同的反向索引形式: 一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表. 一个单词的水平反向索引(或者完全反向索引)又包含每个单词在一个文档中的位置.[1] 后者的形式提供了更多的兼容性(比如短语搜索),但是需要更多的时间和空间来创建. 使用