Jak NAJSZYBCIEJ pobrać dane z pliku?

0

Witam. Biorę pierwszy raz udział w olimpiadzie informatycznej. Jestem w trakcie rozwiązywania jednego z zadań. I wszystko ładnie pięknie wychodzi:) wyniki prawidłowe zarówna dla małych jak i dużych danych.

Program podczas testowania jest uruchamiany na zasadzie:
program.exe <dane.in>dane.out w konsoli

Dla małych danych program wykonuje się w 0.000s dla większych danych (mówie tu o łańcuchach znaków o długości do 1 000 000) już tak kolorowo nie jest:( wyniki ok ale czas duży;( dla naprawde wielkich danych dochodzi do 20s ;( gdzie limit wynosi 5s...

Do wczytywania używam zwykłego cin.. a dane zapisuje po prostu w tablicy charów..

No więc moje pytanie brzmi: Czy istnieje jakiś szybszy sposób na wczytanie danych?

0

Wywal cin i użyj scanf oraz fgets. A i tak najważniejsze jest algo.

0

Wyłącz synchronizację:
http://www.cplusplus.com/refe[...]eam/ios_base/sync_with_stdio/

Ewentualnie możesz używać printf i scanf. GCC optymalizuje printfy i scanfy, tzn jeżeli masz np printf("%d\n", liczba); to GCC zamienia to wprost na kod, który wypisuje to co ma wypisywać, tak że ciąg "%d\n" jest w kodzie wynikowym niewykorzystywany.

0

Zdecydowanie tak, fread ze stdin do buforów o odpowiedniej wielkości (parę kb zwykle jest ok). Cin jest wygodny, szczególnie przy przeładowaniu operatorów dla własnych klas, ale szybkością to nie grzeszy, szczególnie bez optymalizacji (pamiętaj także, że cały STL jest przygotowany pod kompilację z włączoną optymalizacją). Chwilowo może pomóc wyłączenie synchronizacji ze stdio.

0

Jak użyc funkcji fread w moim przykładzie?

Sory za post pod postem ale nie wiem czemu mi to nie działa:

 unsigned int n;
    scanf("%u",&n);

    char name1[n+1],name2[n+1];
    fgets(name1,n,stdin);
    fgets(name2,n,stdin);

;(

0

Co znaczy "nie działa"? Spróbuj w fgets dać n+1
To też jest dyskusyjne(chociaż przy gcc zadziała):

char name1[n+1],name2[n+1];

No i nie licz na to, że zmiana sposobu wczytywania, aż tak skróci czas. Problem nie jest po stronie wczytywania, a algorytmu.

0

dodanie "n+1" nie pomaga;( chodzi to to ze uruchamiam program, in czeka na podane danych- funkcja scanf no i klikne np 3 i enter nastepnie znowu czeka na podanie danych 11 funkcja fgets podam jakis tam ciag a 2 funkcja fgets tak jakby sie nie wywoływała.

0

powiedz coś więcej o "dane.in", co tam siedzi? liczba i dwa być może nawet bardzo długie dwa wiersze ?

0

plik ma taka strukturę :

5
ABCDE
EDCBA

oczywiście o długości łańcuchów świadczy liczba i może ona wynosi max 1 000 000..

0

Wziąłeś pod uwagę to, że scanf nie pobiera '\n', więc pierwszy fgets bierze samo '\n'?

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