Матч 336, Названия сервисов (ServiceNames)

Дивизион 2, Уровень 2

 

Набор сервисов, с каждым из которых связаны некоторые действия, описывается массивом строк. Первым словом в каждой строке стоит название сервиса, за которым следуют связанные с ним действия. Необходимо составить список всех действий, для каждого из которых найти все сервисы, в которых они встречаются.

 

Класс: ServiceNames

Метод: vector<string> makeList(vector<string> services)

Ограничения: services содержит от 1 до 50 строк длины не более 50 символов ‘A’-‘Z’,‘a’-‘z’, названия сервисов в каждой строке уникальны.

 

Вход. Массив строк services, описывающий сервисы.

 

Выход. Массив строк, содержащий список действий в лексикографическом порядке, за которыми следует стрелка в виде “==>” и названия сервисов, в которых встречаются эти действия. Последовательность сервисов для каждого действия должна выводиться в лексикографическом порядке. Сервисы разделять запятыми, после каждой запятой следует ставить один пробел.

 

Пример входа

Services

{"BLAST Genome Annotation Sensitivity","PING","X Annotation"}

{"PING"}

{"BLAST Genome annotation Sensitivity","PING","X Annotation",

"Apple X ample"}

 

Пример выхода

{"Annotation ==> BLAST, X", "Genome ==> BLAST", "Sensitivity ==> BLAST" }

{}

{"Annotation ==> X","Genome ==> BLAST","Sensitivity ==> BLAST","X ==> Apple",

 "ample ==> Apple","annotation ==> BLAST" }

 

 

РЕШЕНИЕ

обработка строк + структуры данных

 

Каждому действию поставим в соответствие набор сервисов, в которых оно встречается при помощи отображения map. Набор сервисов для каждого действия будем хранить во множестве set.

Читаем входные данные, строим отображение m, связывающее действия с набором сервисов. Затем проходим по каждому действию и строим выходные строки, содержащие его название, стрелку и список сервисов, в которых оно встречается.

 

ПРОГРАММА

 

#include <cstdio>

#include <set>

#include <map>

#include <vector>

#include <string>

#include <algorithm>

#include <sstream>

using namespace std;

 

class ServiceNames

{

public:

  map<string,set<string> > m;

  map<string,set<string> >::iterator iter;

  set<string>::iterator s_iter;

  set<string> temp;

  string a, b;

  vector<string> res;

 

  vector<string> makeList(vector<string> services)

  {

    for(int i = 0; i <services.size(); i++)

    {

      stringstream s(services[i]);

      s >> a;

      while (s >> b) m[b].insert(a);

    }

 

    for(iter = m.begin(); iter != m.end(); iter++)

    {

      a = (*iter).first + " ==> ";

      temp = (*iter).second;

      for(s_iter = temp.begin(); s_iter != temp.end(); s_iter++)

         a = a + (*s_iter) + ", ";

      a = a.substr(0,a.size() - 2);

      res.push_back(a);

    }

    return res;

  }

};