Informatică, întrebare adresată de claudianastasiu, 8 ani în urmă

Se dă un număr n și n + 1 cuvinte formate din litere mici ale alfabetului englez. Să se afle numărul de cuvinte (excluzându-l pe primul) care sunt anagrame ale primului cuvânt.


Un cuvânt e anagramă a altui cuvânt dacă ele conțin aceleași litere, nu neapărat în aceeași ordine.

Date de intrare

Pe prima linie se află numărul n. Pe următoarele n + 1 linii se află cuvintele.


Date de ieșire

Programul va afișa numărul cerut.
Restricții
1 ≤ n ≤ 50
Lungimea fiecărui cuvânt este mai mică sau egală cu 100 000.
Exemple
Date de intrare
4
server
revers
serve
sserver
server
Date de iesire
2
Explicație
revers și server sunt anagramele cuvântului server.
Limbaj C++


fatman195322: Două idei f. bune de rezolvare sunt deja aici: https://brainly.ro/tema/8848425
Apollyon: Mai te poți folosi și de un std::map în care cheile să-ți fie literele cuvântului și valoarea / cheie să fie numărul de apariții a literei respective, compari după valorile din std::map-uri și dacă-s egale ai anagramă.

Răspunsuri la întrebare

Răspuns de Apollyon
0

Răspuns:

#include <iostream>

#include <map>

#include <vector>

#include <string>

std::map<char, int> creareDictionar(const std::string& cuvantCurent);

void creareVector(int numarCuvinte, std::vector<std::string>& vectorCuvinte);

int main()

{

    int numarCuvinte, contorAnagrame{};

    std::cout << "Introdu numarul de cuvinte >> ";

    std::cin >> numarCuvinte;

    /* vectorul în care salvăm cuvintele */

    std::vector<std::string> vectorCuvinte;

    creareVector(numarCuvinte, vectorCuvinte);

    /* creăm primul dicționar pentru a-l putea compara cu restul */

    std::map<char, int> primulDictionar = creareDictionar(vectorCuvinte.at(0));

    for (std::size_t i{ 1 }; i < vectorCuvinte.size(); ++i) {

     /* creăm dicționarul cuvântului curent */

     std::map<char, int> dictionarCurent = creareDictionar(vectorCuvinte.at(i));

     /* și dacă cele două dicționare sunt egale => anagramă */

     if (primulDictionar == dictionarCurent) {

          std::cout << "Cuvantul \"" << vectorCuvinte.at(i) << "\" este anagrama!\n";

          contorAnagrame++;

      }

   }

    /* la final afișăm câte anagrame avem */

    std::cout << contorAnagrame << "\n";

    return 0;

}

void creareVector(int numarCuvinte, std::vector<std::string>& vectorCuvinte)

{

    vectorCuvinte.reserve(numarCuvinte + 1);

    /* citim cuvântul și-l adăugăm în std::vector */

    for (int i{}; i < numarCuvinte + 1; ++i) {

         std::string cuvantCitit;

         std::cout << "Introdu cuvantul >> ";

         std::cin >> cuvantCitit;

         vectorCuvinte.push_back(cuvantCitit);

    }

}

std::map<char, int> creareDictionar(const std::string& cuvantCurent)

{

    std::map<char, int> dictionar;

    for (const char& caracterCurent : cuvantCurent) {

         /* dacă cheia nu există o adaugă cu valoarea 0 pe care mai apoi o incrementează, dacă există o incrementează */

         dictionar[caracterCurent]++;
    }

    return dictionar;

}

Alte întrebări interesante