Advertisement
Guest User

Decomposition

a guest
Feb 18th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.46 KB | None | 0 0
  1. #include <string>
  2. #include <iostream>
  3. #include <cassert>
  4. #include <vector>
  5. #include <map>
  6.  
  7. using namespace std;
  8.  
  9. enum class QueryType {
  10.     NewBus,
  11.     BusesForStop,
  12.     StopsForBus,
  13.     AllBuses
  14. };
  15.  
  16. struct Query {
  17.     QueryType type;
  18.     string bus;
  19.     string stop;
  20.     vector<string> stops;
  21. };
  22.  
  23. istream& operator >> (istream& is, Query& q) {
  24.     // Реализуйте эту функцию
  25.     string query;
  26.     is >> query;
  27.     if (query == "NEW_BUS") {
  28.         q.type = QueryType::NewBus;
  29.  
  30.         is >> q.bus;
  31.  
  32.         int stop_count = 0;
  33.         is >> stop_count;
  34.         q.stops.resize(stop_count);
  35.         for (auto& stop : q.stops) {
  36.             is >> stop;
  37.         }
  38.     }
  39.     if (query == "BUSES_FOR_STOP") {
  40.         q.type = QueryType::BusesForStop;
  41.         is >> q.stop;
  42.     }
  43.     if (query == "STOPS_FOR_BUS") {
  44.         q.type = QueryType::StopsForBus;
  45.         is >> q.bus;
  46.     }
  47.     if (query == "ALL_BUSES") {
  48.         q.type = QueryType::AllBuses;
  49.     }
  50.     return is;
  51. }
  52.  
  53. struct BusesForStopResponse {
  54.     // Наполните полями эту структуру
  55.     vector<string> getBuses;
  56. };
  57.  
  58. ostream& operator << (ostream& os, const BusesForStopResponse& r) {
  59.     // Реализуйте эту функцию
  60.     if (r.getBuses.size() == 0) {
  61.         os << "No stop";
  62.         os << endl;
  63.     }
  64.     else {
  65.         int i = 1;
  66.         for (const auto& bus : r.getBuses) {
  67.             os << bus;
  68.             if (i < r.getBuses.size()) {
  69.                 os << " ";
  70.             }
  71.         }
  72.         os << endl;
  73.     }
  74.     return os;
  75. }
  76.  
  77. struct StopsForBusResponse {
  78.     // Наполните полями эту структуру
  79.     vector<string> myStops;
  80.     map<string, vector<string>> myMap;
  81. };
  82.  
  83. ostream& operator << (ostream& os, const StopsForBusResponse& r) {
  84.     // Реализуйте эту функцию
  85.     if (r.myMap.size() == 0) {
  86.         os << "No bus";
  87.         os << endl;
  88.     }
  89.     else {
  90.         int i = 1;
  91.         for (auto& stop : r.myStops) {
  92.             os << "Stop " << stop << ":";
  93.             if (r.myMap.count(stop) == 0) {
  94.                 os << " no interchange";
  95.             }
  96.             else {
  97.                 for (auto& bus : r.myMap.at(stop)) {
  98.                     os << " " << bus;
  99.                 }
  100.             }
  101.             //if (i < r.myStops.size()) {
  102.                 os << endl;
  103.             /*}
  104.             i++;*/
  105.         }
  106.     }
  107.     return os;
  108. }
  109.  
  110. struct AllBusesResponse {
  111.     // Наполните полями эту структуру
  112.     map<string, vector<string>> allBuses;
  113. };
  114.  
  115. ostream& operator << (ostream& os, const AllBusesResponse& r) {
  116.     // Реализуйте эту функцию
  117.     if (r.allBuses.empty()) {
  118.         os << "No buses";
  119.         os << endl;
  120.     }
  121.     else {
  122.         //int i = 1;
  123.         for (const auto& bus_item : r.allBuses) {
  124.             os << "Bus " << bus_item.first << ":";
  125.             for (const string& stop : bus_item.second) {
  126.                 os << " " << stop;
  127.             }
  128.             //if (i < r.allBuses.size()) {
  129.                 os << endl;
  130.             /*}
  131.             i++;*/
  132.         }
  133.     }
  134.     return os;
  135. }
  136.  
  137. class BusManager {
  138. public:
  139.     void AddBus(const string& bus, const vector<string>& stops) {
  140.         // Реализуйте этот метод
  141.         buses_to_stops[bus] = stops;
  142.         for (auto& stop : stops) {
  143.             stops_to_buses[stop].push_back(bus);
  144.         }
  145.     }
  146.  
  147.     BusesForStopResponse GetBusesForStop(const string& stop) const {
  148.         // Реализуйте этот метод
  149.         BusesForStopResponse getAllBuses;
  150.         if (stops_to_buses.count(stop)) {
  151.             getAllBuses.getBuses = stops_to_buses.at(stop);
  152.         }
  153.         return getAllBuses;
  154.     }
  155.  
  156.     StopsForBusResponse GetStopsForBus(const string& bus) const {
  157.         // Реализуйте этот метод
  158.         StopsForBusResponse result;
  159.         if (buses_to_stops.count(bus) > 0) {
  160.             for (auto& stop : buses_to_stops.at(bus)) {
  161.                 result.myStops.push_back(stop);
  162.                 for (auto& bus_n : GetBusesForStop(stop).getBuses) {
  163.                     if (bus_n != bus) {
  164.                         result.myMap[stop].push_back(bus_n);
  165.                     }
  166.                 }
  167.             }
  168.         }
  169.         return result;
  170.     }
  171.  
  172.     AllBusesResponse GetAllBuses() const {
  173.         // Реализуйте этот метод
  174.         AllBusesResponse getAllBuses;
  175.         getAllBuses.allBuses = buses_to_stops;
  176.         return getAllBuses;
  177.     }
  178.  
  179. private:
  180.     map<string, vector<string>> buses_to_stops, stops_to_buses;
  181. };
  182.  
  183. // Не меняя тела функции main, реализуйте функции и классы выше
  184.  
  185. int main() {
  186.     int query_count;
  187.     Query q;
  188.  
  189.     cin >> query_count;
  190.  
  191.     BusManager bm;
  192.     for (int i = 0; i < query_count; ++i) {
  193.         cin >> q;
  194.         switch (q.type) {
  195.         case QueryType::NewBus:
  196.             bm.AddBus(q.bus, q.stops);
  197.             break;
  198.         case QueryType::BusesForStop:
  199.             cout << bm.GetBusesForStop(q.stop) << endl;
  200.             break;
  201.         case QueryType::StopsForBus:
  202.             cout << bm.GetStopsForBus(q.bus) << endl;
  203.             break;
  204.         case QueryType::AllBuses:
  205.             cout << bm.GetAllBuses() << endl;
  206.             break;
  207.         }
  208.     }
  209.     return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement