Форум программистов, компьютерный форум, киберфорум
acmades
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

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

Запись от acmades размещена 19.07.2017 в 13:29
Показов 22864 Комментарии 3

Контейнер 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 вне форума
  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 вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Video: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru