Однажды, разбирая старые книги на чердаке, школьник Вася нашёл англо-латинский словарь. Английский он к тому времени знал в совершенстве, и его мечтой было изучить латынь. Поэтому попавшийся словарь был как раз кстати.
К сожалению, для полноценного изучения языка недостаточно только одного словаря: кроме англо-латинского необходим латинско-английский. За неимением лучшего он решил сделать второй словарь из первого.
Как известно, словарь состоит из переводимых слов, к каждому из которых приводится несколько слов-переводов. Для каждого латинского слова, встречающегося где-либо в словаре, Вася предлагает найти все его переводы (то есть все английские слова, для которых наше латинское встречалось в его списке переводов), и считать их и только их переводами этого латинского слова.
Помогите Васе выполнить работу по созданию латинско-английского словаря из англо-латинского.
Входные данные
В первой строке содержится единственное целое число N — количество английских слов в словаре. Далее следует N описаний. Каждое описание содержится в отдельной строке, в которой записано сначала английское слово, затем отделённый пробелами дефис (символ номер 45), затем разделённые запятыми с пробелами переводы этого английского слова на латинский. Переводы отсортированы в лексикографическом порядке. Порядок следования английских слов в словаре также лексикографический.
Все слова состоят только из маленьких латинских букв, длина каждого слова не превосходит 15 символов. Общее количество слов на входе не превышает 100000.
Выходные данные
В первой строке программа должна вывести количество слов в соответствующем данному латинско-английском словаре. Со второй строки выведите сам словарь, в точности соблюдая формат входных данных. В частности, первым должен идти перевод лексикографически минимального латинского слова, далее — второго в этом порядке и т. д. Внутри перевода английские слова должны быть также отсортированы лексикографически.
Sample input:
3
apple - malum, pomum, popula
fruit - baca, bacca, popum
punishment - malum, multa
Sample output:
7
baca - fruit
bacca - fruit
malum - apple, punishment
multa - punishment
pomum - apple
popula - apple
popum - fruit
Не могу понять как вводить данные.
Помогите, пожалуйста!
C/C++
Задача - Англо-латинский словарь.
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <map>
#include <set>
#include <regex>
using namespace std;
vector<string> file() {
return {
"3",
"apple - malum, pomum, popula",
"fruit - baca, bacca, popum",
"punishment - malum, multa"
};
}
void show(const vector<string>& box) {
for (const auto& line : box) cout << line << '\n';
}
void show(const map<string, set<string>>& box) {
for (const auto& [key, sequence] : box) {
string line = key + " - ";
for (const auto& value : sequence) line += value + ", ";
line.pop_back();
line.pop_back();
cout << line << '\n';
}
}
void trim(string& line) {
line = regex_replace(line, regex(" +"), " ");
line.erase(0, line.find_first_not_of(" "));
line.erase(line.find_last_not_of(" ") + 1);
}
map<string, set<string>> parse(const vector<string>& box) {
multimap<string, string> tmp;
for (auto& line : box) {
stringstream ss(line);
string value;
getline(ss, value, '-');
trim(value);
string key;
while (getline(ss, key, ',')) {
trim(key);
tmp.insert({ key, value });
}
}
map<string, set<string>> dic;
for (const auto& [key, value] : tmp) dic[key].insert(value);
return dic;
}
int main() {
auto data = file();
show(data);
auto dic = parse(vector<string>{data.begin() + 1, data.end()});
cout.put('\n');
show(dic);
system("pause > nul");
}
#include <string>
#include <sstream>
#include <vector>
#include <map>
#include <set>
#include <regex>
using namespace std;
vector<string> file() {
return {
"3",
"apple - malum, pomum, popula",
"fruit - baca, bacca, popum",
"punishment - malum, multa"
};
}
void show(const vector<string>& box) {
for (const auto& line : box) cout << line << '\n';
}
void show(const map<string, set<string>>& box) {
for (const auto& [key, sequence] : box) {
string line = key + " - ";
for (const auto& value : sequence) line += value + ", ";
line.pop_back();
line.pop_back();
cout << line << '\n';
}
}
void trim(string& line) {
line = regex_replace(line, regex(" +"), " ");
line.erase(0, line.find_first_not_of(" "));
line.erase(line.find_last_not_of(" ") + 1);
}
map<string, set<string>> parse(const vector<string>& box) {
multimap<string, string> tmp;
for (auto& line : box) {
stringstream ss(line);
string value;
getline(ss, value, '-');
trim(value);
string key;
while (getline(ss, key, ',')) {
trim(key);
tmp.insert({ key, value });
}
}
map<string, set<string>> dic;
for (const auto& [key, value] : tmp) dic[key].insert(value);
return dic;
}
int main() {
auto data = file();
show(data);
auto dic = parse(vector<string>{data.begin() + 1, data.end()});
cout.put('\n');
show(dic);
system("pause > nul");
}
Привет. Я не понял тво вопрос. Вводные данные это число строк плюс сами строки с переводами. Надо его инвертировать, для этого например мона забацать структуру списка из пар слов англ+лат. Напрр QList<QPair<QString, QString>>. Либо хэшик с ключами из латинских слов. А значения - список англ переводов.
Похожие вопросы
- Решите задачу на любом языке. Желательно на с++.
- Задачу написать на с++ , она не сложная но почему то не получается напишите задачу с помощью цикла
- Решите задачу на с++, или хотя бы скажите идею как это вообще решать пожалуйста.
- Решите задачу на любом языке, или хотя бы скажите идею как это вообще решать пожалуйста.
- СРОЧНО! Помогите с задачей.
- Помогите с кодом задачи c++. задача на фото
- Задача по программированию. Решить на Python или C++
- Помогите решить задачу по программированию на C++
- Можете подсказать по задаче или дать алгоритм задачи, код опять же не нужен
- Решите, пожалуйста, задачу на c++