實現一種簡單的搜索引擎功能,快速滿足多達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; }