SPOJ przekroczony limit czasu

0

proste zadanko, odwracanie wyrazow, jednak moj kod nie moze sie zmiescic w czasie przeznaczonym na wykonania (bez przerwy komunikat przekroczono czas wykonania), co tu poradzic? ;)


#include <iostream>
#include <cstring>
using namespace std;


int main()
{

	char tab[1001];
	register int i=0,c;

	while (1)
	{
		cin>>tab;
		c=strlen(tab);
	
		for (c; c>=0; c--) 	
			cout<<tab[c];

	cout<<endl;
	}


	return 0;
}
0

nie wypisuj po jednym znaku tylko calymi wyrazami i bedzie lepiej

0

ok, tylko mam wypisac od konca, jak to zorbic inaczej (nie po znaku) ?

0

przenieść do tablicy odwrotnie, zakończyć zerem, wypisać.

edit: ach, i nie używaj cin/cout!

0

A czy program nie powinien sie kiedys zakonczyc?

PS. Zauwaz, ze strlen tez jest petla - przechodzi lancuch znakow do znalezienia NULLa. Moglbys to zrobic hurtem razem z wypisaniem, np. wykorzystujac stos.

0

@msm, w sensie:
i=0;
for (c; c>=0; c--)
tab1[i]=tab[c];
i++;
tab1[i]='\0';

cout<<tab1;

no ale jezeli dobrez Cie zrozumialem, to chyba to nie zmniejszy czasu wykonania programu?

a dlaczego lepiej nie uzywac cin i cout? to z czego zamiast tego?

@johny_bravo

koniec to EOF, wiec ctrl-z przewywa program
ten Twoj sposob jest dla mnie zbyt hardcorowy xD

0

@owen: Ctrl+C przerywa program, ctrl+z oznacza koniec strumienia danych, ktorego nie sprawdzasz, zatem program sie nie konczy. Szybkie sprawdzenie na spoju i zamiana z cin,cout na printf, scanf robi roznice ;)

0

jeśli tab1 to druga tablica, a tab to wczytany tekst to o to chodziło. To zmniejszy czas wykonania programu, bo zamiast kilkunastu/dziesięciu wywołań wolnej funkcji cout wywołasz ją tylko raz.
Poza tym cout jest wolne, lepiej użyj zwykłych funkcji printf i scanf (jeśli zależy ci na czasie).

Ale johny też ma rację - twój program ma pętlę nieskończoną bez warunku stopu ( while (1) ) - do czego ona właściwie jest?

0
johny_bravo napisał(a)

A czy program nie powinien sie kiedys zakonczyc?
Moim zdanie to jest źródło jego problemów. Jego kod nigdy się nie kończy, więc sędzia uznaje, że przekroczył limit czasu.

Wystarczy, że poprawi tak:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
        char tab[1001];
        register int i=0,c;

        while (cin>>tab) // tu poprawka
        {
                // tu cos  było
                c=strlen(tab);
       
                for (c; c>=0; c--)    // tu masz na dodatek błąd sam domyśl się jaki
                        cout<<tab[c];

        cout<<endl;
        }
        return 0;
}
0

dzieki, rzeczywiscie przez tego while'a wszystko ;)

no i c trzeba zmniejszyc przed petla :)

0

Strumienie (cin i cout) są wolniejsze od printf i scanf, i z tego powodu nie powinno się ich używać, jeżeli program ma wypisywać/wczytywać duże zestawy danych. Jeżeli jednak chcesz ich używać, to na początku programu daj:
ios_base::sync_with_stdio(0);
To przyspieszy działanie strumieni.

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