nochnoikoshmar1

Untitled

Mar 7th, 2023
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1. #include <cmath>
  2. #include <map>
  3. #include <string>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <set>
  7. #include <utility>
  8. #include <vector>
  9. #include <numeric>
  10. #include <chrono>
  11. #include <type_traits>
  12. #include <cassert>
  13. #include <sstream>
  14. using namespace std;
  15.  
  16. class Synonyms{
  17. public:
  18.     void Add(const string &first_word, const string &second_word){
  19.         synonyms_[first_word].insert(second_word);
  20.         synonyms_[second_word].insert(first_word);
  21.     }
  22.  
  23.     size_t GetSynonymCount(const string &word) const{
  24.         if(synonyms_.count(word) != 0){
  25.             return synonyms_.at(word).size();
  26.         }
  27.         return 0;
  28.     }
  29.  
  30.     bool AreSynonyms(const string &first_word, const string &second_word) const{
  31.  
  32.         if(!first_word.empty() && !second_word.empty() && first_word != second_word){
  33.  
  34.             if(synonyms_.count(first_word) == 1){
  35.                 if(synonyms_.count(second_word) == 1){
  36.                     return false;
  37.                 }
  38.             }else{
  39.                 return true;
  40.             }
  41.            
  42.         }
  43.         return false;
  44.     }
  45.  
  46. private:
  47.     map<string, set<string>> synonyms_;
  48. };
  49.  
  50. void TestAddingSynonymsIncreasesTheirCount(){
  51.     Synonyms synonyms;
  52.     assert(synonyms.GetSynonymCount("music"s) == 0);
  53.     assert(synonyms.GetSynonymCount("melody"s) == 0);
  54.  
  55.     synonyms.Add("music"s, "melody"s);
  56.     // Два слова являются синонимами друг друга
  57.     assert(synonyms.GetSynonymCount("music"s) == 1);
  58.     assert(synonyms.GetSynonymCount("melody"s) == 1);
  59.  
  60.     synonyms.Add("music"s, "tune"s);
  61.     assert(synonyms.GetSynonymCount("music"s) == 2);
  62.  
  63.     // Отношение синонимичности в нашей постановке задачи не является транзитивным.
  64.     // Поэтому слова "tune" и "melody" синонимами друг друга не являются,
  65.     // несмотря на то что оба они являются синонимами слова "music".
  66.     assert(synonyms.GetSynonymCount("tune"s) == 1);
  67.     assert(synonyms.GetSynonymCount("melody"s) == 1);
  68. }
  69.  
  70. void TestAreSynonyms(){
  71.     Synonyms synonyms;
  72.  
  73.     assert(synonyms.AreSynonyms("music"s, "melody"s) == true);
  74.     assert(synonyms.AreSynonyms("music"s, "music"s) == false);
  75. }
  76.  
  77. void TestSynonyms(){
  78.     TestAddingSynonymsIncreasesTheirCount();
  79.     TestAreSynonyms();
  80. }
  81.  
  82. int main(){
  83.     TestSynonyms();
  84.  
  85.     Synonyms synonyms;
  86.     string line;
  87.  
  88.     while(getline(cin, line)){
  89.         istringstream command(line);
  90.         string action;
  91.         command >> action;
  92.  
  93.         if(action == "ADD"s){
  94.             string first_word, second_word;
  95.             command >> first_word >> second_word;
  96.             synonyms.Add(first_word, second_word);
  97.        
  98.         }else{
  99.             if(action == "COUNT"s){
  100.                 string word;
  101.                 command >> word;
  102.                 cout << synonyms.GetSynonymCount(word) << endl;
  103.  
  104.             }else{
  105.                 if(action == "CHECK"s){
  106.                     string first_word, second_word;
  107.                     command >> first_word >> second_word;
  108.  
  109.                     if(synonyms.AreSynonyms(first_word, second_word)){
  110.                         cout << "YES"s << endl;
  111.                     }else{
  112.                         cout << "NO"s << endl;
  113.                     }
  114.                 }else{
  115.                     if(action == "EXIT"s){
  116.                         break;
  117.                     }
  118.                 }
  119.             }
  120.         }
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment