Spoj - Zliczacz Liter- Blędna Odpowiedz

0

Witam, mam problem z pewnym zadaniem na SPOJ.
Link do zadania: http://pl.spoj.com/problems/JZLICZ/
Napisałem g program, który wg. mnie działa dobrze i podaje prawidłowe wyniki, lecz SPOJ wyświetla komunikat o błędnej odpowiedzi. Pomoże ktoś co może być tutaj nie tak? ```

#include <iostream>
#include <string>
using namespace std;
 
int main() 
{
        
        char MalyAlfabet[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        int IloscZnakowMalegoAlfabetu[26]={0};
        char DuzyAlfabet[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        int IloscZnakowDuzegoAlfabetu[26]={0};
        string slowo;
        int n;
        do
        {
        	cout<<"Podaj liczbe testow: ";
        	cin>>n;
		}while(n>150);
		for(int i=0; i<=n; i++)
		{
		 	getline(cin, slowo);
		 	if(slowo.size()>200)
		 	cout<<"Zbyt dlugie!";
		 	for(int j=0; j<slowo.size(); j++)
		 	{
		 		for(int y=0; y<26; y++)
		 		{
		 			if(slowo[j]==MalyAlfabet[y])
		 			IloscZnakowMalegoAlfabetu[y]++;
		 			if(slowo[j]==DuzyAlfabet[y])
		 			IloscZnakowDuzegoAlfabetu[y]++;
				}
		 		
			}
			
			
		}
		
		for(int u=0; u<26; u++)
		{
			if(IloscZnakowMalegoAlfabetu[u]==0)
			continue;
			else
			cout<<MalyAlfabet[u]<<" "<<IloscZnakowMalegoAlfabetu[u]<<endl;
		}
		for(int w=0; w<26; w++)
		{
			if(IloscZnakowDuzegoAlfabetu[w]==0)
			continue;
			else
			cout<<DuzyAlfabet[w]<<" "<<IloscZnakowDuzegoAlfabetu[w]<<endl;
		}
		
		return 0;
		
        
} 

5

Masz wypisać dokładnie to co jest w specyfikacji, żadnych podaj liczbe testow: albo zbyt dlugie.
Możesz również zakładać, że dane wejściowe są prawidłowe, czyli nie trzeba sprawdzać czy np. string ma nie więcej niż 200 znaków.

1

Robisz to źle :-P Nie trzeba tablic, do sprawdzenia, czy litera jest mała, czy duża, itd. Poczytaj o isupper(), islower() z biblioteki <cctype>.

Ponadto zastanów się, ile razy wykona się ta pętla:

for (int i = 0; i <= n; ++i)

I po co tak:

 if(IloscZnakowMalegoAlfabetu[u]==0)
   continue;
else
  cout<<MalyAlfabet[u]<<" "<<IloscZnakowMalegoAlfabetu[u]<<endl;

Skoro można prościej:

if (IloscZnakowMalegoAlfabetu[u])
  cout << ...
1

Być może najprostsze rozwiązanie:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

void print_letter(char letter, size_t occurences)
{
	if(occurences)
		cout << letter << ' ' << occurences << '\n';
}

int main() {
	vector<size_t> result(128, 0);
	size_t n; string s;
	for(cin >> n; n; n--) {
		getline(cin>>ws, s);
		for(char c: s)
			result[c]++;
	}
	
	for(char c = 'a'; c <= 'z'; c++)
		print_letter(c, result[c]);
	for(char c = 'A'; c <= 'Z'; c++)
		print_letter(c, result[c]);
}

Może być tak, że sprawdzarka jest uczulona na to, czy ktoś wypisuje na wyjście pojedynczy '\n' nawet, jeśli nie ma żadnej litery. W takim wypadku powyższy kod trzeba troszkę zmodyfikować. EDIT: Sprawdziłem, nie jest uczulona, kod działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1