Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Adaptor semnal hi to low

Jocuri Android Multiplayer online...

Diferenta consum smart meter - Co...

Recomandare demontare+instalare ...
 CAIET SERVICE PREDEAL II

Internare spital psihiatrie

CM de snooker 2024

Scot penele dupa montajul tamplar...
 Masina de spalat vase si grasimea

Noua lege de acces in paduri

Sunt ouale proaspete?

Aplicatie invatare limba Germana
 Presbiopia - la 43 ani ?

Termen transcriere autovehicul

Cazare Timisoara pe 4-5 zile

Primele zile ale internetului per...
 

[TEMÃ] Determinare anagrame

- - - - -
  • Please log in to reply
11 replies to this topic

#1
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013
Salut. Se dă un şir de caractere ce conţine cuvinte formate din litere mici ale alfabetului englez, separate prin unul sau mai multe spații. Să se determine câte cuvinte din sir sunt anagrame ale ultimului cuvânt, fără a fi identice cu acesta.

Exemplu:

Intrare said:

arc ingrat din granit car argint arc rating rac argint

Iesire said:

3

Ce am făcut arată cam aşa:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef char matrice_cuvinte[100][30];

int determinare_anagrame(matrice_cuvinte matrice, int numar_cuvinte)
{
	int suma = 0;
	char copie_ulitimul_cuvant[40];

	strcpy(copie_ulitimul_cuvant, matrice[numar_cuvinte - 1]);

	sort(copie_ulitimul_cuvant, copie_ulitimul_cuvant + strlen(copie_ulitimul_cuvant));

	for (int i = 0; i < numar_cuvinte - 1; i++)
	{
		if (strcmp(matrice[i], matrice[numar_cuvinte - 1]) != 0)   // nu este deja identic cu ultimul cuvant din matrice
		{
			sort(matrice[i], matrice[i] + strlen(matrice[i]));
			suma += (strcmp(matrice[i], copie_ulitimul_cuvant) == 0);
		}
	}

	return suma;
}

void construire_matrice_cuvinte(matrice_cuvinte &matrice, char sir_cuvinte[], int &numar_cuvinte)
{
	numar_cuvinte = 0;

	char *p = strtok(sir_cuvinte, " ");
	while (p != NULL)
	{
		strcpy(matrice[numar_cuvinte++], p);
		p = strtok(NULL, " ");
	}
}

int main(void)
{
	char sir_cuvinte[300];
	matrice_cuvinte matrice;
	int numar_cuvinte;

	cin.get(sir_cuvinte, 255);

	construire_matrice_cuvinte(matrice, sir_cuvinte, numar_cuvinte);

	cout << determinare_anagrame(matrice, numar_cuvinte);

	return 0;
}



Însă primesc 60 puncte (pic un test).

Edited by sftpdt, 23 May 2015 - 07:08.


#2
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,430
  • Înscris: 10.08.2005
Felicitari!
Ce test pici?

#3
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013
Scrie doar Raspuns gresit.

Spoiler


#4
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,430
  • Înscris: 10.08.2005
eu din codul tau nu reusesc sa inteleg unde determini daca un cuvant este anagrama altui cuvant.

#5
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013
Le sortez pe amândouă şi verific dacă sunt identice.

int determinare_anagrame(matrice_cuvinte matrice, int numar_cuvinte)
{
	int suma = 0;

	char copie_ulitimul_cuvant[40];

	strcpy(copie_ulitimul_cuvant, matrice[numar_cuvinte - 1]);

	sort(copie_ulitimul_cuvant, copie_ulitimul_cuvant + strlen(copie_ulitimul_cuvant)); // aici sortez copia ultimului cuvant

	for (int i = 0; i < numar_cuvinte - 1; i++)
	{
		if (strcmp(matrice[i], matrice[numar_cuvinte - 1]) != 0)   // nu este deja identic cu ultimul cuvant din matrice
		{
			sort(matrice[i], matrice[i] + strlen(matrice[i])); // sortez cuvantul actual
			suma += (strcmp(matrice[i], copie_ulitimul_cuvant) == 0); // verific daca sunt identice
		}
	}

	return suma;
}


Edited by sftpdt, 23 May 2015 - 07:31.


#6
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,430
  • Înscris: 10.08.2005
aia e functia care iti numara,
return suma
eu vreau doar partea care deterinama daca doua cuvinte sunt anagrame

mai pe romaneste, separa o problema de alta

#7
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013
bool Cuvinte_anagrame(char cuvant1[], char cuvant2[])
{
	char copie1[100], copie2[100];

	strcpy(copie1, cuvant1);
	strcpy(copie2, cuvant2);

	sort(copie1, copie1 + strlen(copie1));
	sort(copie2, copie2 + strlen(copie2));

	return ( strcmp(copie1, copie2) == 0 );
}



#8
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Faci prea multe copii inutile. Eu as salva tot inputul intr-un singur string, si intr-un alt array pozitiile inceputurilor cuvintelor (daca cuvintele sunt mereu despartite de un singur caracter) inca din timpul citirii.

Pentru claritatea algoritmului, as salva si pozitiile ultimelor litere ale tuturor cuvintelor intr-un alt array.

Dupa ce am scanat ultimul cuvant, stiu exact unde sa sar in interiorul acestui string citit si ce caractere sa compar cu care caractere.

Totul manual, fara functii.

Daca vrei ceva mai avansat, te poti gandi la un algoritm de hashing bazat pe numere prime. Nu ar trebui sa ai coliziuni. Nu e un algoritm neaparat mai eficient, doar mai provocator dpv intelectual.

Daca vrei si mai avansat, te poti inspira de aici: https://github.com/s...aster/bitgram.c

Edited by OriginalCopy, 23 May 2015 - 10:38.


#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
De ce nu folosesti std::string?

#10
sftpdt

sftpdt

    Senior Member

  • Grup: Senior Members
  • Posts: 3,664
  • Înscris: 29.08.2013

View PostOriginalCopy, on 23 mai 2015 - 09:47, said:


Mai fac copii deoarece nu se ştie când mai am nevoie de respectiva variabilă.. Mersi de sfat :D.

Se pare că nu luam 100p din cauza dimensiunilor tablourilor. Le-am mai mărit şi e ok.

View Postdani.user, on 23 mai 2015 - 11:03, said:

De ce nu folosesti std::string?

Să mai exersez cu char*. Am anul viitor bacalaureatul şi nu cred că am voie cu string (sau vector/map/algorithm/etc) ... din comoditatea multor profesori cărora le este lene să înveţe lucruri noi şi se bazează pe aceeaşi materie.

#11
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Citind codul tau ma tot intreb ce-i matricea de cuvinte. Mai degraba e un vector de cuvinte.
Rezolvarea mi se pare mult mai eleganta urmand niste pasi simpli:
  • Spargerea propozitiei in cuvinte
  • Iterarea prin toate cuvintele mai putin ultimul
  • Verificarea relatiei de anagrama intre fiecare cuvant si ultimul

#include <iostream>
#include <sstream>
#include <vector>
#include <cstring>

using namespace std;

bool isAnagram(const string& first, const string& second)
{
   if ((first == second) || (first.size() != second.size()))
   {
	  return false;
   }
   int letterOccurences[256] = {0};
   int reference[256] = {0};
   for (auto& c : first) {
	  ++letterOccurences[c];
   }
   for (auto& c : second) {
	  --letterOccurences[c];
   }
   return memcmp(letterOccurences, reference, sizeof(reference)) == 0;
}

vector<string> getWords(const string& sentence)
{
   vector<string> result;
   istringstream stream(sentence);
   string word;
   while (getline(stream, word, ' ')) {
	  result.push_back(word);
   }
   return result;
}

int count_anagrams_of_last_word(const string& sentence)
{
   int result = 0;
   auto words = getWords(sentence);
   auto& lastWord = words[words.size() - 1];

   for (int i = 0; i < words.size() - 1; i++) {
	  if (isAnagram(words[i], lastWord)) {
		 ++result;
	  }
   }

   return result;
}

int main()
{
   cout << count_anagrams_of_last_word("arc ingrat din granit car argint arc rating rac argint") << endl;
   return 0;
}



#12
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postsftpdt, on 23 mai 2015 - 11:11, said:

Se pare că nu luam 100p din cauza dimensiunilor tablourilor. Le-am mai mărit şi e ok
Cu solutia mea, nu ai fi avut tablouri in primul rand.

Complexitatea algoritmului e aceeasi, insa copierea de date insasi costa si ea.

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate