天天看點

Engine-字元串(C++實訓題)

寫在前面:僅為個人代碼/總結,未必标準,僅供參考!如有錯誤,還望指出交流,共同進步!

Engine-字元串

【問題描述】谷歌、百度等搜尋引擎已經成為了互連網中不可或缺的一部分。在本題中,你的任務也是設計一個搜尋論文的搜尋引擎,當然,本題的要求比起實際的需求要少了許多。

本題的輸入将首先給出一系列的論文,對于每篇論文首先給出标題,然後給出它被引用的次數。然後會有一系列的搜尋詢問,詢問标題中包含特定關鍵詞的論文有哪些。

每一個詢問可能包含多個關鍵詞,你需要找出标題包含所有關鍵詞的論文。

“包含”必須是标題中有一個詞正好是給定的關鍵詞,不區分大小寫。

對每個詢問,都按被引用的次數從多到少輸出滿足條件的論文的标題。如果有被引用的次數相同的論文,則按照論文在輸入中的順序排列,先給出的論文排在前面。

【輸入形式】輸入包含多組資料。

每組資料首先有一行包含一個整數N(1<=N<=1000),表示論文的數目,N=0表示輸入結束。每組論文的資訊第一行是論文的标題,由字母(大小寫均可)和空格組成,不超過10個詞,每個詞不超過20個字元,标題總共不超過250個字元。第二行是一個整數K(0<=K<=108),表示它被引用的次數。在論文資訊結束以後,有一行包含一個整數M(1<=M<=100),表示詢問的數目。接下來有M行,每行是一個詢問,由L(1<=L<=10)個空格分開的詞構成,每個詞不超過20個字元。

【輸出形式】對每個詢問,按照題目給定的順序輸出滿足條件的論文的标題;如果沒有滿足條件的論文,就不輸出。在每組詢問的輸出之後輸出一行“***”,在每組資料的輸出之後輸出一行“—”。

Engine-字元串(C++實訓題)

【示例代碼】

#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;
}
           

繼續閱讀