進階實驗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()) != '\n') c ++;
        name[i][c] = 0;
        c = 0;
        while((ch = getchar()) && ch != '#') {
            if(ch == ' ' || ch == '\n') {
                str[e] = 0;
                if(!pos[str]) pos[str] = ++ no;
                f[pos[str]][i].push_back(c);
                e = 0;
                if(ch == '\n') {
                    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()) != '\n') {
            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\n",num);
        if(!num) printf("Not Found\n");
        for(int i = 0;i < num;i ++) {
            int d = ansnum[i];
            printf("%s\n",name[d]);
            for(auto it = ans[d].begin();it != ans[d].end();it ++) {
                printf("%s\n",s[d][*it]);
            }
        }
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM