Bibliothèque numérique PAT-1022

Une bibliothèque numérique contient des millions de livres, stockés en fonction de leurs titres, auteurs, mots clés de leurs résumés, éditeurs et années de publication. Chaque livre se voit attribuer un numéro unique à 7 chiffres comme identifiant. Étant donné toute requête d'un lecteur, vous êtes censé sortir les livres résultants, triés par ordre croissant de leurs identifiants.

Spécification d'entrée:

Chaque fichier d'entrée contient un cas de test. Pour chaque cas, la première ligne contient un entier positif N (≤104) qui est le nombre total de livres. Puis N blocs suivent, chacun contenant les informations d'un livre en 6 lignes:

  • Ligne n ° 1: le numéro d'identification à 7 chiffres;
  • Ligne n ° 2: le titre du livre - une chaîne de 80 caractères maximum;
  • Ligne n ° 3: l'auteur - une chaîne de 80 caractères maximum;
  • Ligne n ° 4: les mots clés - chaque mot est une chaîne de 10 caractères maximum sans espace blanc, et les mots clés sont séparés par exactement un espace;
  • Ligne n ° 5: l'éditeur - une chaîne de 80 caractères maximum;
  • Ligne n ° 6: l'année publiée - un nombre à 4 chiffres compris dans la plage [1000, 3000].

On suppose que chaque livre appartient à un seul auteur et ne contient pas plus de 5 mots clés; il n'y a pas plus de 1000 mots clés distincts au total; et il n'y a pas plus de 1000 éditeurs distincts.

Après les informations sur le livre, il y a une ligne contenant un entier positif M (≤1000) qui est le nombre de requêtes de recherche de l'utilisateur. Puis M lignes suivent, chacune dans l'un des formats indiqués ci-dessous:

  • 1: un titre de livre
  • 2: nom d'un auteur
  • 3: un mot clé
  • 4: nom d'un éditeur
  • 5: un nombre à 4 chiffres représentant l'année

Spécification de sortie:

Pour chaque requête, imprimez d'abord la requête d'origine sur une ligne, puis affichez les ID de livre résultants dans un ordre croissant, chacun occupant une ligne. Si aucun livre n'est trouvé, imprimez à la Not Foundplace.

Exemple d'entrée:

3
1111111
The Testing Book
Yue Chen
test code debug sort keywords
ZUCS Print
2011
3333333
Another Testing Book
Yue Chen
test code sort keywords
ZUCS Print2
2012
2222222
The Testing Book
CYLL
keywords debug book
ZUCS Print2
2011
6
1: The Testing Book
2: Yue Chen
3: keywords
4: ZUCS Print
5: 2011
3: blablabla

Exemple de sortie:

1: The Testing Book
1111111
2222222
2: Yue Chen
1111111
3333333
3: keywords
1111111
2222222
3333333
4: ZUCS Print
1111111
5: 2011
1111111
2222222
3: blablabla
Not Found

Faites attention au problème

  • Problème de saisie de format, cin ne lit pas \ n les caractères de nouvelle ligne, donc si le caractère de nouvelle ligne n'est pas traité après la lecture de l'identifiant, le résultat lu par getline est le caractère de nouvelle ligne.

  • Index inversé, créez 5 cartes;

Code

#include <set>
#include <iostream>
#include <map>
#include <iomanip>
using namespace std;
map<string, set<int>> query_map[5];
int main()
{
    
    
    int n;
    cin >> n;
    int id;
    string  t_title, t_keyword, t_author, t_publisher, t_publish_time;
    for (int i = 0; i < n; i++)
    {
    
    
        // cin >> id;
        scanf("%d\n", &id);
        // getline(cin, id);
        getline(cin, t_title);
        query_map[0][t_title].insert(id);
        getline(cin, t_author);
        query_map[1][t_author].insert(id);
        while (cin >> t_keyword)
        {
    
    
            query_map[2][t_keyword].insert(id);
            char ch = getchar();
            if (ch == '\n')
                break;
        }
        getline(cin, t_publisher);
        query_map[3][t_publisher].insert(id);
        getline(cin, t_publish_time);
        query_map[4][t_publish_time].insert(id);
    }
    int m;
    cin >> m;
    int index;
    string q; // 查询条件
    for (int i=0; i<m; i++){
    
    
        scanf("%d: ", &index);
        getline(cin, q);
        cout << index << ": " << q <<endl;
        index--;
        map<string, set<int>>::iterator it = query_map[index].find(q);
        if (it != query_map[index].end()){
    
    
            set<int>::iterator set_it;
            for(set_it = query_map[index][q].begin(); set_it != query_map[index][q].end(); set_it++){
    
    
                cout <<setw(7) << setfill('0') << setiosflags(ios::right) <<  *set_it <<endl;
                // cout << *set_it << endl;
            }
        }else{
    
    
            cout << "Not Found" << endl;
        }
    }
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42100456/article/details/109552277
conseillé
Classement