实现一种简单的搜索引擎功能,快速满足多达1条关键字查询请求。
输入格式:
输入首先给出正整数 N(≤ 100),为文件总数。随后按以下格式给出每个文件的内容:第一行给出文件的标题,随后给出不超过 100 行的文件正文,最后在一行中只给出一个字符 #
,表示文件结束。每行不超过 50 个字符。在 N 个文件内容结束之后,给出查询总数 M(≤),随后 M 行,每行给出不超过 10 个英文单词,其间以空格分隔,每个单词不超过 10 个英文字母,不区分大小写。
输出格式:
针对每一条查询,首先在一行中输出包含全部该查询单词的文件总数;如果总数为 0,则输出 Not Found
。如果有找到符合条件的文件,则按输入的先后顺序输出这些文件,格式为:第1行输出文件标题;随后顺序输出包含查询单词的那些行内容。注意不能把相同的一行重复输出。
输入样例:
4
A00
Gold
silver truck
#
A01
Shipment of gold
damaged
in a fire
#
A02
Delivery
of silver
arrived in
a silver
truck
#
A03
Shipment of gold
arrived in
a truck
#
2
what ever
silver truck
输出样例:
0 Not Found 2 A00 silver truck A02 of silver a silver truck
文件标题可能存在空格,全程用getchar读取字符然后整合,用unordered_map将字符串转换成整型方便数组中映射,记录每个字符串对应每个文件中都有哪几行存在,对于查询,外层遍历每个文件,内层遍历字符串,需要字符串都在则记录文件编号,并把所有包含的行各自记录到set,去重,输出。
代码:
#include <cstdio> #include <iostream> #include <cstring> #include <vector> #include <unordered_map> #include <cctype> #include <set> using namespace std; unordered_map<string,short> pos;///字符串映射为int vector<short> f[1000][100];///记录字符串对应文件号包含的行号 char s[100][101][51],name[100][51],str[101],sear[10][11],ch; int no; int main() { int n,m; scanf("%d",&n); for(int i = 0;i < n;i ++) { getchar(); int c = 0,d = 0,e = 0; while((name[i][c] = getchar()) != ' ') c ++; name[i][c] = 0; c = 0; while((ch = getchar()) && ch != '#') { if(ch == ' ' || ch == ' ') { str[e] = 0; if(!pos[str]) pos[str] = ++ no; f[pos[str]][i].push_back(c); e = 0; if(ch == ' ') { s[i][c][d] = 0; d = 0; c ++; continue; } } else str[e ++] = tolower(ch); s[i][c][d ++] = ch; } } scanf("%d",&m); getchar(); while(m --) { int c = 0,nn = 0; set<int> ans[100];///记录输出的行号 while((ch = getchar()) != ' ') { if(ch == ' ') sear[nn ++][c] = 0,c = 0; else sear[nn][c ++] = tolower(ch); } sear[nn ++][c] = 0;// int ansnum[100]; int num = 0,j; for(int i = 0;i < n;i ++) { for(j = 0;j < nn;j ++) { if(f[pos[sear[j]]][i].empty()) break; } if(j < nn) continue; ansnum[num ++] = i; for(int j = 0;j < nn;j ++) { int d = pos[sear[j]]; for(auto it = f[d][i].begin();it != f[d][i].end();it ++) { ans[i].insert(*it); } } } printf("%d ",num); if(!num) printf("Not Found "); for(int i = 0;i < num;i ++) { int d = ansnum[i]; printf("%s ",name[d]); for(auto it = ans[d].begin();it != ans[d].end();it ++) { printf("%s ",s[d][*it]); } } } return 0; }