寫在前面:僅為個人代碼/總結,未必标準,僅供參考!如有錯誤,還望指出交流,共同進步!
Engine-字元串
【問題描述】谷歌、百度等搜尋引擎已經成為了互連網中不可或缺的一部分。在本題中,你的任務也是設計一個搜尋論文的搜尋引擎,當然,本題的要求比起實際的需求要少了許多。
本題的輸入将首先給出一系列的論文,對于每篇論文首先給出标題,然後給出它被引用的次數。然後會有一系列的搜尋詢問,詢問标題中包含特定關鍵詞的論文有哪些。
每一個詢問可能包含多個關鍵詞,你需要找出标題包含所有關鍵詞的論文。
“包含”必須是标題中有一個詞正好是給定的關鍵詞,不區分大小寫。
對每個詢問,都按被引用的次數從多到少輸出滿足條件的論文的标題。如果有被引用的次數相同的論文,則按照論文在輸入中的順序排列,先給出的論文排在前面。
【輸入形式】輸入包含多組資料。
每組資料首先有一行包含一個整數N(1<=N<=1000),表示論文的數目,N=0表示輸入結束。每組論文的資訊第一行是論文的标題,由字母(大小寫均可)和空格組成,不超過10個詞,每個詞不超過20個字元,标題總共不超過250個字元。第二行是一個整數K(0<=K<=108),表示它被引用的次數。在論文資訊結束以後,有一行包含一個整數M(1<=M<=100),表示詢問的數目。接下來有M行,每行是一個詢問,由L(1<=L<=10)個空格分開的詞構成,每個詞不超過20個字元。
【輸出形式】對每個詢問,按照題目給定的順序輸出滿足條件的論文的标題;如果沒有滿足條件的論文,就不輸出。在每組詢問的輸出之後輸出一行“***”,在每組資料的輸出之後輸出一行“—”。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxsGVOVTQU9UMRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0YzM3EjM0UTM0ADOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
【示例代碼】
#include <bits/stdc++.h>
using namespace std;
struct Citiao
{
string Yname;//原名
string Bname;//将名字中的所有大寫字母改為小寫字母後的名字
int Quote;//被引用次數
};
bool cmp(Citiao p,Citiao q)//引用次數排序
{
return p.Quote>q.Quote;
}
int main()
{
while(1)
{
int N;
cin>>N;
if(N==0) {break;}
Citiao C[N];
for(int i=0;i<N;i++)
{
cin.get();//getline()前吸收換行符
string s;
getline(cin,s);
C[i].Yname=s;
cin>>C[i].Quote;
int len=C[i].Yname.length();
char ch[250];
for(int j=0;j<len;j++)
{
if(C[i].Yname[j]>='A'&&C[i].Yname[j]<='Z')//大寫字母變小寫字母
{
ch[j]=C[i].Yname[j]+32;
}
else//其他不變
{
ch[j]=C[i].Yname[j];
}
}
ch[len]='\0';
C[i].Bname=ch;
}
int M;
cin>>M;
cin.get();
for(int i=0;i<M;i++)
{
string s;
getline(cin,s);//輸入搜尋關鍵詞
int len=s.length();
int u=0,v=0;
char ch[20];
string str[10];
//将字元串分為一個個單詞
for(int j=0;j<len;j++)
{
if(s[j]>='A'&&s[j]<='Z')
{
s[j]+=32;
}
if(s[j]==' ')
{
ch[u]='\0';
str[v++]=ch;
u=0;
continue;
}
ch[u++]=s[j];
if(j==len-1)
{
ch[u]='\0';
str[v++]=ch;
}
}
Citiao res[60];
int t=0;
for(int j=0;j<N;j++)
{
int o=0;
for(int k=0;k<v;k++)//以單詞為機關搜尋
{
int L=str[k].length();
int pos=C[j].Bname.find(str[k]);
if(pos!=-1)
{
string::iterator it=C[j].Bname.begin()+pos+L;
if(*it==' '||*it=='\0')
{
o++;
}
}
}
if(o==v)//若關鍵詞中的每個單詞都為詞條所包含,則搜尋結果包含該詞條
{
res[t++]=C[j];
}
}
if(t==0) {cout<<endl<<"***"<<endl;continue;}
sort(res,res+t,cmp);//排序
for(int j=0;j<t;j++)
{
cout<<res[j].Yname<<endl;
}
cout<<"***"<<endl;
}
cout<<"---"<<endl;
}
return 0;
}