进阶实验5-3.4 迷你搜索引擎 (35分)

实现一种简单的搜索引擎功能,快速满足多达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;
}
原文地址:https://www.cnblogs.com/8023spz/p/12315902.html