HDU_2532(附带解题思路)

今天收获还是有的 虽说写了很长时间没写出来 ,不过从别人的代码中也学到了一些知识和思路。更看到了自己的不足
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
废话不多说先看题
Problem Description
谷歌、百度等搜索引擎已经成为了互连网中不可或缺的一部分。在本题中,你的任务也是设计一个搜索论文的搜索引擎,当然,本题的要求比起实际的需求要少了许多。
本题的输入将首先给出一系列的论文,对于每篇论文首先给出标题,然后给出它被引用的次数。然后会有一系列的搜索询问,询问标题中包含特定关键词的论文有哪些。
每一个询问可能包含多个关键词,你需要找出标题包含所有关键词的论文。
“包含”必须是标题中有一个词正好是给定的关键词,不区分大小写。
对每个询问,都按被引用的次数从多到少输出满足条件的论文的标题。如果有被引用的次数相同的论文,则按照论文在输入中的顺序排列,先给出的论文排在前面。

Input

输入包含多组数据。
每组数据首先有一行包含一个整数N(1<=N<=1000),表示论文的数目,N=0表示输入结束。每组论文的信息第一行是论文的标题,由字母(大小写均可)和空格组成,不超过10个词,每个词不超过20个字符,标题总共不超过250个字符。第二行是一个整数K(0<=K<=108),表示它被引用的次数。在论文信息结束以后,有一行包含一个整数M(1<=M<=100),表示询问的数目。接下来有M行,每行是一个询问,由L(1<=L<=10)个空格分开的词构成,每个词不超过20个字符。
Output

对每个询问,按照题目给定的顺序输出满足条件的论文的标题;如果没有满足条件的论文,就不输出。在每组询问的输出之后输出一行”***”,在每组数据的输出之后输出一行”—”。

Sample Input

6
Finding the Shortest Path
120
Finding the k Shortest Path
80
Find Augmenting Path in General Graph
80
Matching in Bipartite Graph
200
Finding kth Shortest Path
50
Graph Theory and its Applications
40
6
shortest path
k shortest path
graph
path
find
application
0

Sample Output

Finding the Shortest Path
Finding the k Shortest Path
Finding kth Shortest Path


Finding the k Shortest Path


Matching in Bipartite Graph
Find Augmenting Path in General Graph
Graph Theory and its Applications


Finding the Shortest Path
Finding the k Shortest Path
Find Augmenting Path in General Graph
Finding kth Shortest Path
Find Augmenting Path in General Graph

总体思路
这个题目的坑点一个在于排序 另一个在于对输入数据进行空格处理
总的思路就是先按照题目输入n个文章标题,然后进行一个处理,具体操作就是
先把这个字符串转换成统一的 我转成了小写,然后用变量i记录空格数 结束这个循环后用变量j对字符串重新赋值 处理结束后进行排序 用cmp定义排序规则 如果数目相同的时候就按输入的顺序排序 及结构体中的id进行从小到大排序 反之按数量排序从大到小 再输入要比较的k个字符串,进行处理 然后用strstr判断关键词是否存在这个文章标题里面

#include<stdio.h>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
	char title[300];
	char low[300];
	int id;
	int num;
}text[1005];
char c[300];//要比较的字符串 
int cmp(const node&x,const node&y)//定义 排序规则  
{
	if(x.num==y.num) return x.id<y.id;
	else return x.num>y.num;
}
void chuli(char *s)//功能就是 实现每个单词之间只有一个空格 消除多余空格 
{
	int i=0,len=0,j=0,n=strlen(s);
	strlwr(s);
	while(i<n)
	{
		while(i<n&&s[i]==' '){//记录空格数 
			i++;
		}
		j=i;
		while(j<n&&s[j]!=' '){//重新赋值 
			s[len++]=s[j++];
		}
		if(j!=i){//若之前有单词了 就添加一个空格 并令i=j继续循环 
			s[len++]=' ';
			i=j;
		}
	}
	c[len]='\0';
}
int main()
{
	int i,j,k,n;
	while(cin>>n&&n)
	{
		for(i=0;i<n;i++)
		{
			getchar();
			gets(text[i].title);
			strcpy(text[i].low,text[i].title);
			chuli(text[i].low);
			cin>>text[i].num;
			text[i].id=i;
		}
		sort(text,text+n,cmp);
		cin>>k;
		getchar();
		while(k--)
		{
			gets(c);
			chuli(c);
			for(i=0;i<n;i++)
			{
				if(strstr(text[i].low,c)){
					puts(text[i].title); 
				}
			}
			printf("***\n");
		}
		printf("---\n");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值