HNU程序设计训练2023——Engine-字符串

【问题描述】

       谷歌、百度等搜索引擎已经成为了互连网中不可或缺的一部分。在本题中,你的任务也是设计一个搜索论文的搜索引擎,当然,本题的要求比起实际的需求要少了许多。
       本题的输入将首先给出一系列的论文,对于每篇论文首先给出标题,然后给出它被引用的次数。然后会有一系列的搜索询问,询问标题中包含特定关键词的论文有哪些。
       每一个询问可能包含多个关键词,你需要找出标题包含所有关键词的论文。
    “包含”必须是标题中有一个词正好是给定的关键词,不区分大小写。
      对每个询问,都按被引用的次数从多到少输出满足条件的论文的标题。如果有被引用的次数相同的论文,则按照论文在输入中的顺序排列,先给出的论文排在前面。

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

【输出形式】

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

【样例输入1】

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

【样例输出1】

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
***

***
---

【样例输入2】

1
Finding the Shortest Path
120
2
Path

Pat
0

【样例输出2】

Finding the Shortest Path

***

***

---

【样例说明】

需要查询的内容为“k shortest path”,他包含了3个独立的关键词。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

struct Paper
{
	string title = "";//小写版
	string TITLE = "";//原始版
	int cite = 0;
};
bool cmp(Paper a, Paper b)
{
	return a.cite > b.cite;
}
bool Find(string key,Paper paper)
{
	int flag = paper.title.find(key);
	if (flag == -1)
		return false;
	if (flag != 0)
	{
		if(paper.title[flag - 1] != ' ')
			return false;
	}
	if (paper.title.length() != flag + key.length())
	{
		if (paper.title[flag + key.length()] != ' ')
			return false;
	}
	return true;
}
int main()
{
	int n = 0;
	while (cin >> n)
	{
		getchar();
		if (n == 0) break;
		vector<Paper> paper(n);
		for (int i = 0; i < n; i++)
		{
			getline(cin, paper[i].title);
			paper[i].TITLE = paper[i].title;
			int papersize = paper[i].title.length(); 
			for (int j = 0; j < papersize; j++)
			{
				if (paper[i].title[j] <= 'Z' && paper[i].title[j] != ' ')
				{
					paper[i].title[j] += 'a' - 'A';
				}
			}
			cin >> paper[i].cite;
			getchar();
		}
		stable_sort(paper.begin(), paper.end(), cmp);//一种稳定的排序
		//完成论文信息输入并排序
		int m = 0;
		cin >> m;
		getchar();
		vector<string> search(m);
		for (int i = 0; i < m; i++)
		{
			getline(cin,search[i]);
			int keysize = search[i].length();
			for (int j = 0; j < keysize; j++)
				if (search[i][j] <= 'Z'&& search[i][j] != ' ')
					search[i][j] += 'a' - 'A';
		}
		//完成搜索信息输入

		for (int k = 0; k < m; k++)
		{
			for (int i = 0; i < n; i++)
			{
				int  left = 0;
				bool FLAG = true;
				for (int j = search[k].find(' '); j != -1; j = search[k].find(' ', j + 1))
				{
					string tmp(search[k], left, j - left);
					bool flag = Find(tmp, paper[i]);
					if (!flag)
					{
						FLAG = false;
						break;
					}
					left = j + 1;
				}
				if (!FLAG)
					continue;
				string tmp(search[k], search[k].rfind(' ') + 1);//最后一个关键字
				FLAG = Find(tmp, paper[i]);
				if (!FLAG)
					continue;
				else
					cout << paper[i].TITLE << endl;
			}
			cout << "***" << endl;
		}
		cout << "---" << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值