/* ТРАНСПОНИРОВАНИЕ АНГЛО–ЛАТИНСКОГО СЛОВАРЯ (С СИНОНИМАМИ) */ /* Однажды, разбирая старые книги на чердаке, школьник Вася нашёл англо-латинский словарь. Английский он к тому времени знал в совершенстве, и его мечтой было изучить латынь. Поэтому попавшийся словарь был как раз кстати. К сожалению, для полноценного изучения языка недостаточно только одного словаря: кроме англо-латинского необходим латино-английский. За неимением лучшего он решил сделать второй словарь из первого. Как известно, словарь состоит из переводимых слов, к каждому из которых приводится несколько слов-переводов. Для каждого латинского слова, встречающегося где-либо в словаре, Вася предлагает найти все его переводы (то есть все английские слова, для которых наше латинское встречалось в его списке переводов), и считать их и только их переводами этого латинского слова. Помогите Васе выполнить работу по созданию латино-английского словаря из англо-латинского. Входные данные В первой строке содержится единственное целое число N — количество английских слов в словаре. Далее следует N описаний. Каждое описание содержится в отдельной строке, в которой записано сначала английское слово, затем отделённый пробелами дефис, затем разделённые запятыми с пробелами переводы этого английского слова на латинский. Переводы отсортированы в лексикографическом порядке. Порядок следования английских слов в словаре также лексикографический. Все слова состоят только из маленьких латинских букв, длина каждого слова не превосходит 15 символов. Общее количество слов на входе не превышает 100000. Выходные данные В первой строке программа должна вывести количество словарных записей в соответствующем данному латино-английском словаре. Со второй строки выведите сам словарь, в точности соблюдая формат входных данных. В частности, первым должен идти перевод лексикографически минимального латинского слова, далее — второго в этом порядке и т.д. Внутри перевода английские слова должны быть также отсортированы лексикографически. */ #include #include #include #include using namespace std; int main () { int n; // число записей в англо-латинском словаре // ВВОД try { // можно обойтись и без try-throw-catch, но тогда программа может работать вхолостую! if (!cin) throw (0); // необязательно cin >> n; if (n < 1) throw (0); } catch (int) { cout << 0; // если словарь пуст, выводим 0 return 0; } map > Lat_Eng; // латино-английский словарь string Term, Trans; // ВВОД ПО СЛОВАМ И ЗАПОЛНЕНИЕ СЛОВАРЯ for (int i = 0; i < n; ++i) { cin >> Term >> Trans; // считываем слово и дефис while (cin && ('\n' != cin.peek ())) { cin >> Trans; // считываем перевод… // запятая в конце слова не нужна: if (',' == Trans [Trans.length () - 1]) Trans.pop_back (); // добавляем пару в латино-английский словарь: Lat_Eng [Trans].insert (", " + Term); } } // ВЫВОД РЕЗУЛЬТАТОВ cout << Lat_Eng.size () << endl; // выводим число записей в латино-английском словаре for (auto article : Lat_Eng) { string Junk = " "; // начинаем с пробела! for (auto tr : article.second) Junk += tr; // собираем все переводы в одну строку, Junk [1] = '-'; // исправляем первую запятую на дефис cout << (article.first + Junk + '\n'); // выводим словарную запись } return 0; } /* _ПОЯСНЕНИЯ_ ✓ По соображениям рационализма в программе отсутствует создание англо-латинского словаря. ✓ Все входные данные объединяются в пары, которые сразу же помещаются в латино-английский словарь. ✓ Лексикографическая сортировка словарных записей, а также синонимичных переводов внутри каждой из них, реализуются АВТОМАТИЧЕСКИ в соответствии с заявленными характеристиками классов map и set. ✓ Число 0 — количество записей в латино-английском словаре — должно быть выведено на экран в любом из случаев не обрабатываемых алгоритмом! Код программы НЕ претендует на совершенство. */