Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ «Неделя вторая - Контейнер map - Анаграммы» #12

Войти
Регистрация
Восстановить пароль
Оценить эту запись

С++ «Неделя вторая - Контейнер map - Анаграммы» #12

Запись от acmades размещена 19.07.2017 в 13:29
Обновил(-а) acmades 19.07.2017 в 14:15 (дописал)

Контейнер map, проверяем анаграммы.
Курс: «Основы разработки на C++: белый пояс»
Задание:
Слова называются анаграммами друг друга, если одно из них можно получить перестановкой букв в другом. Например, слово «eat» можно получить перестановкой букв слова «tea», поэтому эти слова являются анаграммами друг друга. Даны пары слов, проверьте для каждой из них, являются ли слова этой пары анаграммами друг друга.

Указание
Один из способов проверки того, являются ли слова анаграммами друг друга, заключается в следующем. Для каждого слова с помощью словаря подсчитаем, сколько раз в нём встречается каждая буква. Если для обоих слов эти словари равны (а это проверяется с помощью обычного оператора ==), то слова являются анаграммами друг друга, в противном случае не являются.
При этом построение такого словаря по слову удобно вынести в отдельную функцию BuildCharCounters.

Формат ввода
Сначала дано число пар слов N, затем в N строках содержатся пары слов, которые необходимо проверить. Гарантируется, что все слова состоят лишь из строчных латинских букв.

Формат вывода
Выведите N строк: для каждой введённой пары слов YES, если эти слова являются анаграммами, и NO в противном случае.

Пример

Ввод
3
eat tea
find search
master stream

Вывод
YES
NO
YES
Моё решение:
C++
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
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
map<char, int> BuildCharCounters(const string& a) { //тут мы будем создавать map в котором будут буквы от слова и их количество
    map <char, int> s1; //в качестве ключа будет буква, в качестве значения - сколько раз она встречается в слове
    for (const auto& ch : a) { //перебираем буквы в слове
        ++s1[ch]; //увидели букву, записали букву в качестве ключа, и в качестве значения добавили единичку...
    }      //если буква еще раз встретится, то еще раз добавится единичка
    return s1; //вернем наш список букв и их количества
}
int main() {
    int i;
    cin >> i; //прочитаем сколько строк надо вводить
    string a, b; // это сами строки
    vector<string> v; //сюда ответы будем выводить
    for (i; i > 0; i--) { // какую цифру ввели вначале, столько раз и повторяем цикл
        cin >> a >> b; //вводим строки
        if (BuildCharCounters(a) == BuildCharCounters(b)) { //сравниваем списки букв с их количеством и если равны...
            v.push_back("YES"); //добавляем "YES"
        }
        else {
            v.push_back("NO"); //иначе добавляем другое слово
        }
    }
    for (auto r : v) {
        cout << r << endl; //тут выводим наши ответы
    }
    return 0;
}
Еще задачка:
Реализуйте справочник столиц стран.

На вход программе поступают следующие запросы:
CHANGE_CAPITAL country new_capital — изменение столицы страны country на new_capital, либо добавление такой страны с такой столицей, если раньше её не было.
RENAME old_country_name new_country_name — переименование страны из old_country_name в new_country_name.
ABOUT country — вывод столицы страны country.
DUMP — вывод столиц всех стран.

Формат ввода
В первой строке содержится количество запросов Q, в следующих Q строках — описания запросов. Все названия стран и столиц состоят лишь из латинских букв, цифр и символов подчёркивания.

Формат вывода
Выведите результат обработки каждого запроса:
В ответ на запрос CHANGE_CAPITAL country new_capital выведите
Introduce new country country with capital new_capital, если страны country раньше не существовало;
Country country hasn't changed its capital, если страна country до текущего момента имела столицу new_capital;
Country country has changed its capital from old_capital to new_capital, если страна country до текущего момента имела столицу old_capital, название которой не совпадает с названием new_capital.
В ответ на запрос RENAME old_country_name new_country_name выведите
Incorrect rename, skip, если новое название страны совпадает со старым, страна old_country_name не существует или страна new_country_name уже существует;
Country old_country_name with capital capital has been renamed to new_country_name, если запрос корректен и страна имеет столицу capital.
В ответ на запрос ABOUT country выведите
Country country doesn't exist, если страны с названием country не существует;
Country country has capital capital, если страна country существует и имеет столицу capital.
В ответ на запрос DUMP выведите
There are no countries in the world, если пока не было добавлено ни одной страны;
разделённые пробелами пары country/capital, описывающие столицы всех стран и упорядоченные по названию страны, если в мире уже есть хотя бы одна страна.

Пример 1

Ввод
6
CHANGE_CAPITAL RussianEmpire Petrograd
RENAME RussianEmpire RussianRepublic
ABOUT RussianRepublic
RENAME RussianRepublic USSR
CHANGE_CAPITAL USSR Moscow
DUMP
Вывод
Introduce new country RussianEmpire with capital Petrograd
Country RussianEmpire with capital Petrograd has been renamed to RussianRepublic
Country RussianRepublic has capital Petrograd
Country RussianRepublic with capital Petrograd has been renamed to USSR
Country USSR has changed its capital from Petrograd to Moscow
USSR/Moscow

Моё решение:
C++
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
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
void ChangeCapital(string& a, string& b, map<string, string>& cc) { //добавляем столицу в страну
    if (cc[a] == "") { //если страны еще нет...
        cc[a] = b; //добавим страну и столицу заодно, простой инициализацией
        cout << "Introduce new country " << a << " with capital " << b << endl; //выведем соответствующее сообщение
    }
    else if (b == cc[a]) { //если страна есть с такой же сталицей...
        cout << "Country " << a << " hasn't changed its capital" << endl; //напишем что не можем добавить
    }
    else { //иначе 
        cout << "Country " << a << " has changed its capital from " << cc[a] << " to " << b << endl; // напишем что мы поменяли столицу на новую
        cc[a] = b; //и поменяем старую столицу на новую
    }
}
void Rename(string& a, string& b, map<string, string>& cc) { //переименуем страну
    map<string, string> ccCopy = cc; //не стал заморачиваться и создал копию
    if (a == b || "" == ccCopy[a] || "" != ccCopy[b]) { //если названия равны или старой страны еще нет или новая уже есть,
        cout << "Incorrect rename, skip" << endl; // то пишем, что все плохо
    }
    else if ("" != cc[a]) { //иначе, если старая страна есть, то
        cout << "Country " << a << " with capital " << cc[a] << " has been renamed to " << b << endl; //пишем что переименовали страну
        auto i = cc[a]; //скопирую название столицы в стране
        cc.erase(a); //сотру старую страну из памяти горожан
        cc[b] = i; //создам новую страну со старой столицей
    }
}
void About(const string& a, const map<string, string>& cc) { //выведу инфу о стране
    map<string, string> ccCopy = cc; // сначала скопирую 
    if("" != ccCopy[a]) { //если в стране что-то есть, то 
        cout << "Country " << a << " has capital " << ccCopy[a] << endl; //выведем что есть
    }
    else { //иначе
        cout << "Country " << a << " doesn't exist" << endl; //напишем что там ничего нет, и страны тоже )))
    }
}
void Dump(const map<string, string>& cc) { //тут просто выводим всё что есть
    if (cc.size() == 0) { //если размер равен 0, то 
        cout << "There are no countries in the world" << endl; //напишем, что ничего нет
    }
    else { //иначе
        for (const auto& i : cc) { //переберем все пары в списке
            cout << i.first << "/" << i.second << " "; //и напишем страну и город
        }
        cout << endl;
    }
}
int main() {
    int i;
    cin >> i; //прочитаем сколько строк надо вводить
    string command; // это начало комманды
    map<string, string> cc;
    for (i; i > 0; i--) { // какую цифру ввели вначале, столько раз и повторяем цикл
        cin >> command; //считываем команду
        if (command == "CHANGE_CAPITAL") { //дальше проверяем какая команда написана и  
            string country, new_capital;
            cin >> country >> new_capital; //если надо, считываем дополнительные значения
            ChangeCapital(country, new_capital, cc); //выполняем соответствующую функцию
        }
        else if (command == "RENAME") { //и так далее
            string old_country_name, new_country_name;
            cin >> old_country_name >> new_country_name;
            Rename(old_country_name, new_country_name, cc);
        }
        else if (command == "ABOUT") {
            string country;
            cin >> country;
            About(country, cc);
        }
        else if (command == "DUMP") {
            Dump(cc);
        }
    }
    return 0;
}
Вот вроде как-то так, но чего-то слишком много кода
Всего комментариев 3

Комментарии

  1. Старый комментарий
    Аватар для ZarinZomanu4
    C++
    1
    
    map<string, string> ccCopy = cc; //не стал заморачиваться и создал копию
    скажите пожалуйста зачем ві создавали єту копию?
    Запись от ZarinZomanu4 размещена 24.07.2017 в 00:15 ZarinZomanu4 вне форума
  2. Старый комментарий
    Цитата:
    Сообщение от ZarinZomanu4 Просмотреть комментарий
    C++
    1
    
    map<string, string> ccCopy = cc; //не стал заморачиваться и создал копию
    скажите пожалуйста зачем ві создавали єту копию?
    да потому, что если где-то нечаянно обратиться ccCopy[b] , а b ещё не существует, то в map создастся новый элемент. И чтобы не заморачиваться, создал дубликат и перелистываю его как угодно, не заморачиваясь что в нем что-то не то создастся. А результат, конечно, в сс нужно записывать.
    Это конечно не правильно, и считаю что нужно и можно улучшить.
    Запись от acmades размещена 24.07.2017 в 08:47 acmades вне форума
    Обновил(-а) acmades 24.07.2017 в 08:48
  3. Старый комментарий
    C++
    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
    
    #include <iostream>
    #include <map>
    #include <string>
    #include <vector>
     
    using namespace std;
     
    int main(){
        int n = 0;
        cin >> n ;
        vector<string> out; 
     
        for (int i=0;i<n;i++){
            string s2="",s1="";
            cin >> s1;
            cin >> s2;
            
            map<char,unsigned> m1, m2;
     
            for (unsigned j=0;j<s1.size();j++){
                ++m1[s1[j]];
            }
            for (unsigned j=0;j<s2.size();j++){
                ++m2[s2[j]];
            }
            if ( m1 == m2 ){
                out.push_back("YES");
            } else{
                out.push_back("NO");
            } 
        }
     
        vector<string>::iterator it;
     
        for (it=out.begin();it!=out.end();it++)
            cout << *it << endl;
     
        return 0;
    }
    Запись от flash_back размещена 10.10.2017 в 11:52 flash_back вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.