Код:
#include <iostream>
#include <string>
#include <map>
#include <set>
#include <limits>
using namespace std;
int main() {
int n;
cin >> n;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
map<string, set<string> > slovar;
for (int i = 0; i < n; i++) {
string s;
getline(cin, s);
int p = s.find(" - ");
string eng = s.substr(0, p);
string lat = s.substr(p + 3);
int start = 0;
while (true) {
int pos = lat.find(", ", start);
string word;
if (pos == -1) {
word = lat.substr(start);
slovar[word].insert(eng);
break;
}
else {
word = lat.substr(start, pos - start);
slovar[word].insert(eng);
start = pos + 2;
}
}
}
cout << slovar.size() << endl;
for (auto x : slovar) {
cout << x.first << " - ";
bool first = true;
for (auto y : x.second) {
if (!first) {
cout << ", ";
}
cout << y;
first = false;
}
cout << endl;
}
return 0;
}
Что происходит текстом
Начало работы программы.
Сначала вводится число n — количество английских слов в словаре.
Далее программа считывает n строк.
В каждой строке есть английское слово, знак - и список латинских переводов.
Например:
apple - malum, pomum, popula
Программа отделяет английское слово от латинских переводов.
Английское слово здесь — apple.
Затем программа разбивает список переводов по запятой.
Получаются латинские слова:
malum
pomum
popula
Для каждого латинского слова программа запоминает, от какого английского слова оно произошло.
Например:
malum - apple
pomum - apple
popula - apple
Если одно латинское слово встречается у нескольких английских слов, все эти английские слова добавляются в список переводов.
Для хранения используется словарь map.
Он автоматически сортирует латинские слова по алфавиту.
Для английских слов используется set.
Он тоже автоматически хранит слова без повторов и в отсортированном порядке.
После обработки всех строк программа выводит количество латинских слов.
Затем выводит новый латинско-английский словарь в нужном формате:
латинское слово - английский перевод
Если переводов несколько, они выводятся через запятую и пробел.
Конец работы программы.