-
Notifications
You must be signed in to change notification settings - Fork 0
/
eng_to_lat.cpp
115 lines (104 loc) · 5.37 KB
/
eng_to_lat.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
* Условие:
* Однажды, разбирая старые книги на чердаке, школьник Вася
* нашёл англо-латинский словарь. Английский он к тому времени
* знал в совершенстве, и его мечтой было изучить латынь.
* Поэтому попавшийся словарь был как раз кстати.
* К сожалению, для полноценного изучения языка недостаточно
* только одного словаря: кроме англо-латинского необходим
* латинско-английский. За неимением лучшего он решил сделать
* второй словарь из первого.
* Как известно, словарь состоит из переводимых слов,
* к каждому из которых приводится несколько слов-переводов.
* Для каждого латинского слова, встречающегося где-либо в словаре,
* Вася предлагает найти все его переводы (то есть все
* английские слова, для которых наше латинское встречалось в
* его списке переводов), и считать их и только их переводами
* этого латинского слова.
* Помогите Васе выполнить работу по созданию
* латинско-английского словаря из англо-латинского.
* Входные данные:
* В первой строке содержится единственное целое число N — количество
* английских слов в словаре. Далее следует N описаний.
* Каждое описание содержится в отдельной строке, в которой записано
* сначала английское слово, затем отделённый пробелами дефис
* (символ номер 45), затем разделённые запятыми с пробелами переводы
* этого английского слова на латинский. Переводы отсортированы
* в лексикографическом порядке. Порядок следования английских слов
* в словаре также лексикографический.
* Все слова состоят только из маленьких латинских букв,
* длина каждого слова не превосходит 15 символов.
* Общее количество слов на входе не превышает 100000.
* Выходные данные:
* В первой строке программа должна вывести количество слов
* в соответствующем данному латинско-английском словаре.
* Со второй строки выведите сам словарь, в точности соблюдая
* формат входных данных. В частности, первым должен идти перевод
* лексикографически минимального латинского слова, далее — второго
* в этом порядке и т.д. Внутри перевода английские слова
* должны быть также отсортированы лексикографически.
*/
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std;
vector<string> get_translate()
{
const char delim = ',';
vector<string> v;
string tr;
int prev_pos = 0, pos = 0;
getline(cin, tr);
while ((pos = tr.find(delim, prev_pos)) != string::npos)
{
v.push_back(tr.substr(prev_pos, pos - prev_pos));
prev_pos = pos + 2;
}
v.push_back(tr.substr(prev_pos, tr.size() - prev_pos));
return v;
}
map<string, vector<string>> &fill_map(map<string, vector<string>> &m, int n)
{
string s;
char delim;
for (int i = 0; i < n; ++i)
{
cin >> s >> delim;
cin.get();
m[s] = get_translate();
}
return m;
}
map<string, vector<string>> eng_to_lat(const map<string, vector<string>> &m)
{
map<string, vector<string>> temp;
for (map<string, vector<string>>::const_iterator it = m.begin();
it != m.end(); it++)
for (int i = 0; i < it->second.size(); ++i)
temp[it->second[i]].push_back(it->first);
return temp;
}
int main()
{
int n;
cin >> n;
map<string, vector<string>> eng_lat;
map<string, vector<string>> lat_eng;
eng_lat = fill_map(eng_lat, n);
lat_eng = eng_to_lat(eng_lat);
cout << lat_eng.size() << endl;
for (map<string, vector<string>>::const_iterator it = lat_eng.begin();
it != lat_eng.end(); it++)
{
cout << it->first << " - ";
for (int i = 0; i < it->second.size(); i++)
{
cout << it->second[i];
if (i + 1 < it->second.size())
cout << ", ";
}
cout << endl;
}
return 0;
}