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, botów: 0