【问题描述】
谷歌、百度等搜索引擎已经成为了互连网中不可或缺的一部分。在本题中,你的任务也是设计一个搜索论文的搜索引擎,当然,本题的要求比起实际的需求要少了许多。
本题的输入将首先给出一系列的论文,对于每篇论文首先给出标题,然后给出它被引用的次数。然后会有一系列的搜索询问,询问标题中包含特定关键词的论文有哪些。
每一个询问可能包含多个关键词,你需要找出标题包含所有关键词的论文。
“包含”必须是标题中有一个词正好是给定的关键词,不区分大小写。
对每个询问,都按被引用的次数从多到少输出满足条件的论文的标题。如果有被引用的次数相同的论文,则按照论文在输入中的顺序排列,先给出的论文排在前面。
【输入形式】输入包含多组数据。
每组数据首先有一行包含一个整数N(1<=N<=1000),表示论文的数目,N=0表示输入结束。每组论文的信息第一行是论文的标题,由字母(大小写均可)和空格组成,不超过10个词,每个词不超过20个字符,标题总共不超过250个字符。第二行是一个整数K(0<=K<=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;
}