zoukankan      html  css  js  c++  java
  • 进阶实验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;
    }
  • 相关阅读:
    Java程序设计11——异常处理
    Hive安装及配置
    zookeeper集群安装(转)
    Linux网络服务管理命令
    Linux网络配置常用命令
    IP地址及子网掩码计算
    linux ftp、sftp、telnet服务开通、更改Orale最大连接数
    SQL多表连接
    用css伪类实现提示框效果
    关于DOM操作的性能优化
  • 原文地址:https://www.cnblogs.com/8023spz/p/12315902.html
Copyright © 2011-2022 走看看