DNA soluzione ufficiale fallisce alcuni testcase

Altro problema con oii_dna.
Ho implementato la soluzione descritta alla finale di biella facendo 100/100, ma mi sono accorto in locale che può andare ben oltre il limite di 10015 chiamate. Ad esempio con questo input il mio programma fa 10105 chiamate a test:
102 caratteri ‘1’ seguiti da 98 volte la sequenza composta da 100 zeri e un ‘1’.
in python: ‘1’*102+(‘0’*100+‘1’)*98
Non capisco come questo sia possibile, visto che la soluzione prende 100 punti e per quanto riesco a ricordare è proprio quella ufficiale.
Qualcuno sa chiarirmi le idee?

Alla riga 24 vuoi controllare se esistono 2 \sqrt N zeri (ricorda di fixare i posti correlati), questo dovrebbe rimuovere le query di troppo.

Edit: prossima volta condividi il codice.

Ho aggiornato il codice, ora passa il test in locale ma prende solo 99/100.

Ecco il nuovo codice:

#include <string>
#include <cmath>

using namespace std;

bool test(string T);

int binSearchZeroesAfter(int high, string s) {
    int low = 0, mid;
    while (low+1 != high) {
        mid = (low+high)/2;
        if (test(s + string(mid, '0'))) {
            low = mid;
        } else {
            high = mid;
        }
    }
    return low;
}

string analizza(int N) {
    int tworoot = 2*(int)sqrt(N);
    if (test(string(tworoot, '0'))) {
        string s(tworoot, '0');
        int zeroes;
        do {
            zeroes = 0;
            do {
                if (test(s + '1')) {
                    s += '1';
                    zeroes = 0;
                } else {
                    zeroes++;
                    s += '0';
                }
            } while (zeroes < tworoot && s.length() < N);
        } while (test(s));
        s.resize(s.length() - zeroes + binSearchZeroesAfter(zeroes+1, s.substr(0, s.length() - zeroes)));
        while (s.length() < N) {
            s = test('1'+s) ? '1'+s : '0'+s;
        }
        return s;
    } else {
        int maxZeroes = binSearchZeroesAfter(tworoot, "");
        string s(maxZeroes, '0');
        int zeroes = 0;
        do {
            if (test(s + '1')) {
                s += '1';
                zeroes = 0;
            } else {
                zeroes++;
                s += '0';
            }
        } while (zeroes <= maxZeroes && s.length() < N);
        s.resize(s.length() - zeroes + binSearchZeroesAfter(zeroes+1, s.substr(0, s.length() - zeroes)));
        while (s.length() < N) {
            s = test('1'+s) ? '1'+s : '0'+s;
        }
        return s;
    }
}