BigSomma errore nella lettura dell'input

Dopo essere stato alle prese con bigmassimo, ora sto provando a risolvere bigsomma.
Purtroppo però dopo innumerevoli sottopoizioni sbagliate/lente ho incontrato un problema mentre provavo a ottimizzare il codice. Originariamente leggevo il file con fread, processavo tutti i caratteri con un pointer e mantenevo una variabile N per capire quando avevo letto tutti i numeri. Per evitare di utilizzare questa variabile ho poi provato a fermare la lettura quando il pointer è arrivato alla fine dell’input senza contare quanti numeri ho processato (posso capirlo dal valore ritornato da fread, che restituisce il numero di byte letti).
Però continuo a ottenere output sbagliati ovunque tranne che nei testcase di esempio.

Ho scritto questo codice, che conta il numero di interi letti da fread:

#include <stdio.h>
#include <cstdlib>

using namespace std;

#define read1 250000020

long long somma(FILE *f) {
    int N = 0;
    char *dtp = (char*)malloc(read1), *eodt;
    // provo a leggere 250 MB di dati
    size_t retv = fread(dtp, 1, read1, f);
    eodt = dtp + retv;
    do {
        N = 10*N + *dtp - '0';
        dtp++;
    } while (*dtp != '\n');
    if (retv != (size_t)read1) {
        // retv è il numero di byte letti, se è meno di 250 MB vuol dire che l'input è già finito e la funzione ha incontrato eof (end of file)
        bool isdig, wasdig = false;
        // numero di interi nell'input
        int count = 0;
        while (dtp != eodt) {
            isdig = *dtp <= '9' && *dtp >= '0';
            // inizio di un nuovo numero se incontro una cifra e il carattere precedente non era una cifra
            if (isdig && !wasdig) count++;
            wasdig = isdig;
            dtp++;
        }
        // 0, in teoria
        return count - N;
    } else {
        // fread non ha letto tutto l'input che eccede 250 MB, ignoro questo caso nei test per semplificarmi la vita
        return 0;
    }
}

Subtask 1 0/0
Testcase 	Risultato 	Dettagli 	Tempo 	Memoria
000 	Not correct 	Incorrect, 0 instead of 17. 	0.006s 	376 KiB
001 	Not correct 	Incorrect, 0 instead of -6. 	0.006s 	408 KiB
Subtask 2 0/1
Testcase 	Risultato 	Dettagli 	Tempo 	Memoria
002 	Not correct 	Incorrect, 100 instead of 1777. 	0.005s 	488 KiB
003 	Not correct 	Incorrect, 100 instead of -19439. 	0.006s 	504 KiB
004 	Not correct 	Incorrect, 1000 instead of -192718. 	0.006s 	496 KiB
005 	Not correct 	Incorrect, 1000 instead of 110546. 	0.005s 	504 KiB
006 	Not correct 	Incorrect, 576 instead of -25448593. 	0.061s 	6.4 MiB
007 	Not correct 	Incorrect, 576 instead of 237353679. 	0.066s 	6.8 MiB
008 	Not correct 	Incorrect, 576 instead of -165373945. 	0.070s 	7.0 MiB
009 	Not correct 	Incorrect, 576 instead of 57135729. 	0.070s 	7.3 MiB
010 	Not correct 	Incorrect, 576 instead of 2006182231. 	0.067s 	7.3 MiB
011 	Not correct 	Incorrect, 576 instead of -34066701623. 	0.083s 	9.3 MiB
Subtask 3 0/1
Testcase 	Risultato 	Dettagli 	Tempo 	Memoria
012 	Not correct 	Incorrect, 640 instead of 898716261441. 	0.717s 	89.5 MiB
013 	Not correct 	Incorrect, 640 instead of -688174453119. 	0.722s 	89.6 MiB
Subtask 4 0/1
Testcase 	Risultato 	Dettagli 	Tempo 	Memoria
014 	Not correct 	Incorrect, 256 instead of 223844677247. 	1.404s 	178.9 MiB
015 	Not correct 	Incorrect, 256 instead of 296792632615. 	1.428s 	178.6 MiB

Come si può vedere il numero di interi nell’input non coincide con N. Altra cosa che ho notato è che in alcuni testcase del subtask due ci sono esattamente gli stessi 100 numeri ripetuti due volte, infatti il mio codice restituiva sempre il doppio del risultato corretto. Qualcuno saprebbe spiegarmi perché incontro questo strano comportamento? Sto facendo qualche erroraccio nella lettura dell’input o è possibile che il numero di interi non coincida con N?

Il problema dovrebbe essere risolto, puoi riprovare?

Il problema è risolto, grazie!

1 Mi Piace