Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2022, 12:23   #1
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
Вопрос Анограммы C++

Здравствуйте, нужно написать программу, которая ищет анограммы в строке и должна выводить эти слова. Вот моя программа, но она выводит отсортированные анограммы, а мне нужны сами эти анограммы. Строка следующая: "Hare Krishna Hare nap teachers cheaters PAN ear era hectares Krishna".
Код:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iterator>
#include <locale>
#include <set>

using namespace std;

int main()
{
    setlocale(0, "");
    priority_queue <string> pque;
    set <string> st1;
    multiset <string> st2;
    set <string> ::iterator it;
    multiset <string> ::iterator it1;
    cout<<"Введите количество слов: ";

    int n;
    cin>>n;
    cout<<endl;

    string word;
    for (int i = 0; i < n; i++)
    {
        cin>>word;
        st1.insert(word);
    }

    for (it = st1.begin(); it != st1.end(); it++)
    {
        string a;
        a = *it;
        transform(a.begin(), a.end(), a.begin(), ::tolower);
        sort(a.begin(), a.end());
        st2.insert(a);
    }

    for (it1 = st2.begin(); it1 != st2.end(); it1++)
    {
        if (st2.count(*it1) > 1) pque.push(*it1);
    }

    while (!pque.empty())
    {
        cout<<pque.top()<<" ";
        pque.pop();
    }
}
Jorsan вне форума Ответить с цитированием
Старый 21.04.2022, 01:21   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

А что если использовать map<string, vector<string>>, в качестве ключа использовать отсортированную строку из маленьких букв, а в значение складывать исходную строку. А потом выводить только те значения, чья длина больше одного.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 21.04.2022, 09:14   #3
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

Я тоже об этом подумал. А разве то, что будет несколько одинаковых ключей - отсортированные строки, никак не отразится на работе программы? Если это так, то может быть поменять исходную строку в ключ, а отсортированную строку в значение.
Jorsan вне форума Ответить с цитированием
Старый 21.04.2022, 09:58   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Jorsan Посмотреть сообщение
никак не отразится на работе программы?
Ну конечно отразится. В векторах-значениях будут находиться те строки, которые состоят из одинакового набора букв, т.е. являющиеся анаграммами.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 21.04.2022, 12:44   #5
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

Теперь получился такой код, но у меня не работает count. В чём может быть причина?
Код:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <iterator>
#include <locale>
#include <set>
#include <map>

using namespace std;

int main()
{
    setlocale(0, "");
    set <string> st1;
    set <string> ::iterator it;
    map <string, string> mp;
    map <string, string> ::iterator mit;
    cout<<"Введите количество слов: ";

    int n;
    cin>>n;
    cout<<endl;

    string word;
    for (int i = 0; i < n; i++)
    {
        cin>>word;
        st1.insert(word);
    }

    for (it = st1.begin(); it != st1.end(); it++)
    {
        string a;
        a = *it;
        transform(a.begin(), a.end(), a.begin(), ::tolower);
        sort(a.begin(), a.end());
        mp.insert(make_pair(*it, a));
    }

    for (mit = mp.begin(); mit != mp.end(); mit++)
    {
        if (mp.count(mit->second) > 1) cout<<mit->first<<" "<<mit->second<<endl;
    }
}
Если отдельно вызвать mp.count(mit->second), то выведутся нули.
Jorsan вне форума Ответить с цитированием
Старый 21.04.2022, 14:17   #6
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

Всё получилось, пришлось поменять ключи и значения местами. Также вот изменённый for:
Код:
    for (mit = mp.begin(); mit != mp.end(); mit++)
    {
        int a = mp.count(mit->first);
        if (a > 1) cout<<mit->second<<endl;
    }
}
Jorsan вне форума Ответить с цитированием
Старый 21.04.2022, 14:27   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Ну если вас все устраивает в работе программы, то ладно. Хотя результат mp.count равен 0 или 1, так что дальнейший if всегда не будет срабатывать.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 21.04.2022, 22:50   #8
Jorsan
Пользователь
 
Регистрация: 14.03.2021
Сообщений: 39
По умолчанию

Как объяснил мне преподаватель, count в map работает только с ключами, и я в этом наглядно убедился, изначально в качестве ключа у меня стояли исходные строки, которые очевидно были разными, соответственно count насчитал для каждой 1, после поменял местами ключи и значения, теперь у меня на месте ключей стоят отсортированные строки, и count считает правильно, например, отсортированная строка из слова "teachers", при обращении к ней с помощью count он выводит 3, так как помимо неё есть ещё cheaters и hectares.
Jorsan вне форума Ответить с цитированием
Старый 21.04.2022, 23:56   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Jorsan Посмотреть сообщение
при обращении к ней с помощью count он выводит 3
Вот это меня и удивляет, так как в map ключи уникальны. Если ключ есть в map, то count вернет 1, а если нет - 0. Покажите код целиком.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц