O rezolvare in c++ daca se poate:
Răspunsuri la întrebare
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<string> lista;
int n, m;
cout << "nr de aparitii: "; cin >> m;
cout << "nr de cuvinte: "; cin >> n;
if (m == 0 || m >= n || n > 50) { throw invalid_argument(""); }
string temp;
for (int i = 0; i < n; i++) {
cin >> temp;
if (temp.length() > 20) { throw invalid_argument("cuvant prea lung"); }
lista.push_back(temp);
}
//transform in litere mici
for (int i = 0; i < lista.size(); i++){
transform(lista[i].begin(), lista[i].end(), lista[i].begin(), tolower);
}
//
auto it = lista.begin();
auto it2 = it;
int count = 0;
while (it != lista.end()) {
count = 0;
for (it2; it2 != lista.end(); it2++) {
if (*it == *it2) {
count++;
}
}
if (count == m) { cout << *it << endl; }
it++;
it2 = it;
}
}
► PERSPECTIVA STL RECOMANDATA
In standard template library avem diverite structuri de date care ne ajuta sa lucram eficient fara sa implementam totul de la 0.
string = clasa folosita pentru memorarea sirurilor de caractere. Inlocuieste practic sirurile de caractere din C si adauga multe functii care faciliteaza lucrul ce acestea.
unordered_map = container ce memoreaza elemente de tip (cheie, valoare). Fiecarei valori ii corespunde o valoarea. Te poti gandi la aceasta ca la un vector, dar in loc de indice care trebuie sa fie un numar natural intr-un range finit, cheia poate fi orice (numar real, obiecte complexe, in cazul nostru cheia este un string). Foloseste in spate functii hash pentru a asigura o complexitate apropiata de O(1) pentru acces la date.
list = lista de elemente, fiecare element e legat de vecini prin pointeri. Foarte util pentru acces secvential la date. Fata de vector inserarea si stergerea se pot realiza in O(1) in loc de O(n) si nu e necesar sa cunoastem dinainte numarul de elemente.
Rezolvare :
#include <iostream>
#include <string>
#include <list>
#include <unordered_map>
using namespace std;
int main() {
int n, m;
string tmp;
unordered_map<string, int> aparitii;
list<string> cuvinte_de_afisat;
cin >> m >> n;
for (int i = 0; i < n; i++) {
cin >> tmp;
++aparitii[tmp];
if (aparitii[tmp] == m + 1) cuvinte_de_afisat.push_back(tmp);
}
for (auto& element : cuvinte_de_afisat ) {
cout << element << endl;
}
}
► PERSPECTIVA STIL C, SCOLARESTE, NERECOMANDAT
Daca te simti intimidat de STL si doresti o rezolvare "ca la liceu" ai mai jos codul.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int n, m;
char cuvinte[21][50];
//Citire date
cin >> m >> n;
for (int i = 0; i < n; i++) {
cin >> cuvinte[i];
}
for (int i = 0; i < n; i++) {
//Sari peste cuvinte sterse
if (strlen(cuvinte[i]) == 0) continue;
int aparitii = 1;
for (int j = i + 1; j < n; j++) {
//Daca cuvantul e regasit mai tarziu in vector sterge-l si mareste nr aparitii
if (strcmp(cuvinte[i], cuvinte[j]) == 0) {
aparitii++;
strcpy(cuvinte[j], "");
}
}
//Afiseaza daca e cazul
if (aparitii >= m) cout << cuvinte[i] << endl;
}
}
► CERINTA
Se da un numar natural n si o lista de n cuvinte, reprezentand o lista de task-uri. Sa se afiseze cuvintele care apar de mai mult de m ori in lista.