• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PROGC02 - Zliczanie wystąpień (kody ASCII) SPOJ

Object Storage Arubacloud
0 głosów
1,294 wizyt
pytanie zadane 23 sierpnia 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)

Cześć, mam problem z zadaniem ze SPOJA (https://pl.spoj.com/problems/PROGC02/). Napisałem program który u mnie działa jak należy, ale SPOJ odrzuca mi go z powodu "Błędnej Odpowiedzi". Wie ktoś dla czego? Mój kod:

#include <iostream>
using namespace std;

string napis;
int ilosc[128];

int main()
{
int iloscLini=0;
    for(int i=0; i<128;i++)//ustawianie wszystkich elementow tablicy na 0
    ilosc[i]=0;
    int dlugosc=0;
    while(getline(cin,napis))//wprowadzanie napisu
    {
        dlugosc=napis.length();
        for(int i=0; i<dlugosc;i++)//zliczanie wystąpień
        {
            for(int j=0; j<128;j++)
        {
            if(napis[i]==j)ilosc[j]++;
        }
        }
      iloscLini++;
    }
  for(int i=0; i<128;i++)//wypisywanie wystąpień
        {
            if(i==10)cout<<i<<" "<<iloscLini<<endl;
            if(ilosc[i]!=0)cout<<i<<" "<<ilosc[i]<<endl;
        }

}

 

2 odpowiedzi

+2 głosów
odpowiedź 23 sierpnia 2018 przez niezalogowany
wybrane 23 sierpnia 2018 przez Piotr Błaszczak
 
Najlepsza

Ilość znaków na 256. Żeby dużo nie zmieniać w kodzie wystarczy użyć rzutowania na unsigned char (zakres 0 - 256). Nie przejmuj się wynikami u siebie (nie muszą się zgadzać - możesz mieć inne kodowanie znaków):

#include <iostream>
using namespace std;

int main()
{
    string napis;
    const int ilosc_rozmiar = 256;
    int ilosc[ilosc_rozmiar]{}; // zerowanie tablicy (C++11)
    int iloscLinii = 0;

    while (getline(cin, napis))
    {
        for (int i = 0; i<napis.length(); i++)
        {
            ilosc[static_cast<unsigned char>(napis[i])]++; // kod danego znaku wskazuje pozycje - nie trzeba dodatkowo przeszukiwac
        }
        iloscLinii++;
    }
    ilosc['\n'] = iloscLinii; // tutaj tak samo dla znaku nowej linii

    for (int i = 0; i<ilosc_rozmiar; i++)
    {
        if (ilosc[i] != 0)
        {
            cout << i << " " << ilosc[i] << endl;
        }
    }
}

Możesz zrobić to zadanie troszkę prościej pobierając po jednym znaku do zmiennej typu unsigned char (z cin ustawionym na std::noskipws(żeby białe znaki też były pobierane)).

komentarz 23 sierpnia 2018 przez Piotr Błaszczak Bywalec (2,890 p.)
Ty mi pomogłeś już chyba 15 razy :)
komentarz 23 sierpnia 2018 przez Piotr Błaszczak Bywalec (2,890 p.)

@Hipcio, W którym miejscu użyć tego rzutowania? Bo nie bardzo rozumiem.

komentarz 23 sierpnia 2018 przez niezalogowany

Policzyłem 10 razy pomogłem :D Dana literka ma swój kod np napis[i]. Zwykły char (ten z std::string) może przechowywać wartości od -128 do 127. Typ unsigned char może od 0 - 255. Czyli żeby otrzymać taki kod jaki chcą na spoju trzeba zrobić tak:

static_cast<unsigned char>(napis[i])
komentarz 23 sierpnia 2018 przez manjaro Nałogowiec (37,390 p.)

Można normalnie bez kombinowania 

if (znak>0) vec.push_back(znak);
else vec.push_back(znak+256);

 

komentarz 24 sierpnia 2018 przez Piotr Błaszczak Bywalec (2,890 p.)

@Hipcio, Wyskakuje mi błąd kompilacji kiedy daje ten kod co podesłałeś :( Chociaż u mnie wszystko działa :/

komentarz 24 sierpnia 2018 przez Piotr Błaszczak Bywalec (2,890 p.)
Już działa, musiałem zaznaczyć C++ 14
0 głosów
odpowiedź 23 sierpnia 2018 przez Gramad Obywatel (1,660 p.)
Oj, męczyłęm się sam z tym zadaniem. Na początek widzę że za rozmiar tablicy przyjmuszjesz 128.
A co z polskimi znakami? Wygoogluj sobie to zadanie, bo już nie pamiętam jak dokładnie się te polskie znaki traktowało.

Podobne pytania

0 głosów
0 odpowiedzi 495 wizyt
0 głosów
1 odpowiedź 238 wizyt
+15 głosów
1 odpowiedź 1,539 wizyt
pytanie zadane 4 września 2016 w SPOJ przez ZakosiliMiNeta Nałogowiec (30,870 p.)

92,681 zapytań

141,583 odpowiedzi

320,070 komentarzy

62,041 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...