Advertisement
khaze1

Перечисляемые типы

Oct 4th, 2023
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.02 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <numeric>
  5. #include <map>
  6. #include <set>
  7. #include <string>
  8. #include <utility>
  9. #include <vector>
  10.  
  11. using namespace std;
  12.  
  13. const int MAX_RESULT_DOCUMENT_COUNT = 5;
  14.  
  15. struct Document {
  16.     int id;
  17.     double relevance;
  18.     int rating;
  19. };
  20.  
  21. struct Query {
  22.     set<string> words_;
  23.     set<string> minus_words_;
  24. };
  25.  
  26. enum class DocumentStatus{
  27.     ACTUAL,
  28.     IRRELEVANT,
  29.     BANNED,
  30.     REMOVED
  31. };
  32.  
  33. string ReadLine() {
  34.     string s;
  35.     getline(cin, s);
  36.     return s;
  37. }
  38.  
  39. int ReadLineWithNumber() {
  40.     int result = 0;
  41.     cin >> result;
  42.     ReadLine();
  43.     return result;
  44. }
  45.  
  46. vector<int> ReadRatings(){
  47.     int n;
  48.     cin >> n;
  49.     vector<int> ratings(n);
  50.     for (int i = 0; i < n; ++i){
  51.         cin >> ratings[i];
  52.     }
  53.     ReadLine();
  54.     return ratings;
  55. }
  56.  
  57.  
  58. vector<int> ReadRatings2(){
  59.     vector<int> ratings(ReadLineWithNumber());
  60.     for (size_t i = 0; i < ratings.size(); ++i){
  61.         cin >> ratings[i];
  62.     }
  63.     return ratings;
  64. }
  65.  
  66. vector<string> SplitIntoWords(const string& text) {
  67.     vector<string> words;
  68.     string word;
  69.     for (const char c : text) {
  70.         if (c == ' ') {
  71.             if (!word.empty()) {
  72.                 words.push_back(word);
  73.                 word.clear();
  74.             }
  75.         } else {
  76.             word += c;
  77.         }
  78.     }
  79.     if (!word.empty()) {
  80.         words.push_back(word);
  81.     }
  82.  
  83.     return words;
  84. }
  85.  
  86. Query ParseQuery(const string& text) {
  87.     Query query;
  88.     string word;
  89.     bool minus_word = false;
  90.     for (const char c : text) {
  91.         if (c == ' ') {
  92.             if (!word.empty()) {
  93.                 if (minus_word){
  94.                     query.minus_words_.insert(word);
  95.                     minus_word = false;
  96.                 }
  97.                 else
  98.                     query.words_.insert(word);
  99.                 word.clear();
  100.             }
  101.         }
  102.         else if (c == '-') {
  103.             minus_word = true;
  104.         }
  105.         else {
  106.             word += c;
  107.         }
  108.     }
  109.     if (!word.empty()) {
  110.         if (minus_word)
  111.             query.minus_words_.insert(word);
  112.         else
  113.             query.words_.insert(word);
  114.     }
  115.  
  116.     return query;
  117.     }
  118.  
  119.  
  120. class SearchServer {
  121. private:
  122.     struct DocumentContent {
  123.         int id = 0;
  124.         vector<string> words;
  125.     };
  126.  
  127.     set<string> stop_words_;
  128.     vector<DocumentContent> documents_;
  129.     map<string, map<int, double>> word_to_document_freqs_;
  130.     map<int, int> ratings_;
  131.     map<int, DocumentStatus> documents_status_;
  132.  
  133.     vector<string> SplitIntoWordsNoStop(const string& text) const {
  134.         vector<string> words;
  135.         for (const string& word : SplitIntoWords(text)) {
  136.             if (stop_words_.count(word) == 0) {
  137.                 words.push_back(word);
  138.             }
  139.         }
  140.         return words;
  141.     }
  142.  
  143.     static int ComputeAverageRating(const vector<int>& ratings) {
  144.         if (ratings.size() == 0) return 0;
  145.         return accumulate(ratings.begin(), ratings.end(), 0) / static_cast<int>(ratings.size());
  146.     }
  147.     double Compute_IDF(const string& word) const {
  148.         return log( static_cast<double>(documents_.size())
  149.             / static_cast<double>(word_to_document_freqs_.at(word).size()) );
  150.     }
  151.  
  152.     void ExcludeMinusWords(const Query& query, map<int, double>& docs_relevance) const {
  153.         for (const string& word : query.minus_words_){
  154.             if (word_to_document_freqs_.count(word)){
  155.                 for (const auto& [id, tf] : word_to_document_freqs_.at(word)){
  156.                     docs_relevance.erase(id);
  157.                 }
  158.             }
  159.         }
  160.     }
  161.     void ExcludeDifferentStatuses(DocumentStatus status, map<int, double>& docs_relevence) const {
  162.         for (const auto [id, relevance] : docs_relevence){
  163.             if (documents_status_.at(id) == status){
  164.                 continue;
  165.             }
  166.             docs_relevence.erase(id);
  167.         }
  168.     }
  169.     vector<Document> FindAllDocuments(const Query& query, DocumentStatus status) const {
  170.         map<int, double> docs_relevance;
  171.         vector<Document> matched_documents;
  172.         for (const string& word : query.words_){
  173.             if (word_to_document_freqs_.count(word)){
  174.                 const double idf = Compute_IDF(word);
  175.                 for (const auto& [id, tf] : word_to_document_freqs_.at(word)){
  176.                     docs_relevance[id] += idf * tf;
  177.                 }
  178.             }
  179.         }
  180.         ExcludeMinusWords(query, docs_relevance);
  181.         ExcludeDifferentStatuses(status, docs_relevance);
  182.  
  183.         for (const auto& [id, relevance] : docs_relevance){
  184.             matched_documents.push_back({id, relevance, ratings_.at(id)});
  185.         }
  186.         return matched_documents;
  187.     }
  188.  
  189. public:
  190.    
  191.     void SetStopWords(const string& text){
  192.         for (const string& word : SplitIntoWords(text)) {
  193.             stop_words_.insert(word);
  194.         }
  195.     }
  196.    
  197.     void AddDocument(int document_id, const string& document
  198.             , DocumentStatus status, const vector<int>& ratings){
  199.         const vector<string> words = SplitIntoWordsNoStop(document);
  200.         int rating = ComputeAverageRating(ratings);
  201.         double tf = 1. / words.size();
  202.         for (const string& word : words){
  203.             word_to_document_freqs_[word][document_id] += tf;
  204.         }
  205.         ratings_[document_id] = rating;
  206.         documents_status_[document_id] = status;
  207.         documents_.push_back({document_id, words});
  208.     }
  209.  
  210.     vector<Document> FindTopDocuments(const string& raw_query, DocumentStatus status) const {
  211.         Query query = ParseQuery(raw_query);
  212.         vector<Document> matched_documents = FindAllDocuments(query, status);
  213.         sort(matched_documents.begin(), matched_documents.end(),
  214.                 [](const Document& ld, const Document& rd) {
  215.                     return ld.relevance > rd.relevance;
  216.                 }
  217.             );
  218.         if (matched_documents.size() > MAX_RESULT_DOCUMENT_COUNT) {
  219.             matched_documents.resize(MAX_RESULT_DOCUMENT_COUNT);
  220.         }
  221.    
  222.         return matched_documents;
  223.     }
  224. };
  225.  
  226.  
  227. /*SearchServer CreateSearchServer(){
  228.     SearchServer search_server;
  229.     //cout << "Set stop words:" << endl;
  230.     search_server.SetStopWords(ReadLine());
  231.     //cout << "Set amoumt of documents:" << endl;
  232.     const int document_count = ReadLineWithNumber();
  233.     for (int document_id = 0; document_id < document_count; ++document_id) {
  234.         //cout << "document " << document_id << ":" << endl;
  235.         string words = ReadLine();
  236.         //cout << "ratings:" << endl;
  237.         vector<int> ratings = ReadRatings();
  238.         search_server.AddDocument(document_id, words, ratings);
  239.     }
  240.     return search_server;
  241. }*/
  242.  
  243.  
  244. void PrintDocument(const Document& document) {
  245.     cout << "{ "s
  246.          << "document_id = "s << document.id << ", "s
  247.          << "relevance = "s << document.relevance << ", "s
  248.          << "rating = "s << document.rating
  249.          << " }"s << endl;
  250. }
  251.  
  252. int main() {
  253.     SearchServer search_server;
  254.     search_server.SetStopWords("и в на"s);
  255.     search_server.AddDocument(0, "белый кот и модный ошейник"s,        DocumentStatus::ACTUAL, {8, -3});
  256.     search_server.AddDocument(1, "пушистый кот пушистый хвост"s,       DocumentStatus::ACTUAL, {7, 2, 7});
  257.     search_server.AddDocument(2, "ухоженный пёс выразительные глаза"s, DocumentStatus::REMOVED, {5, -12, 2, 1});
  258.     search_server.AddDocument(3, "ухоженный скворец евгений"s,         DocumentStatus::BANNED, {9});
  259.     search_server.AddDocument(4, "ухоженный борец кот"s,         DocumentStatus::IRRELEVANT, {9});
  260.     search_server.AddDocument(5, "ухоженный чтец евгений"s,         DocumentStatus::IRRELEVANT, {9});
  261.     search_server.AddDocument(6, "ухоженный собака фпфцуп"s,         DocumentStatus::BANNED, {9});
  262.  
  263.     cout << "ACTUAL:"s << endl;
  264.     for (const Document& document : search_server.FindTopDocuments("пушистый ухоженный кот"s, DocumentStatus::ACTUAL)) {
  265.         PrintDocument(document);
  266.     }
  267.     cout << "BANNED:"s << endl;
  268.     for (const Document& document : search_server.FindTopDocuments("пушистый ухоженный кот"s, DocumentStatus::BANNED)) {
  269.         PrintDocument(document);
  270.     }
  271.     cout << "REMOVED:"s << endl;
  272.     for (const Document& document : search_server.FindTopDocuments("пушистый ухоженный кот"s, DocumentStatus::REMOVED)) {
  273.         PrintDocument(document);
  274.     }
  275.     cout << "IRRELEVANT:"s << endl;
  276.     for (const Document& document : search_server.FindTopDocuments("пушистый ухоженный кот"s, DocumentStatus::IRRELEVANT)) {
  277.         PrintDocument(document);
  278.     }
  279.     cout << "ACTUAL:"s << endl;
  280.     for (const Document& document : search_server.FindTopDocuments("пушистый ухоженный кот"s, DocumentStatus::ACTUAL)) {
  281.         PrintDocument(document);
  282.     }
  283.     return 0;
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement