Diana and Numbers (div3) ... 0/100

Mi chiedo se sia giusta la correzione… 0/100 …
Mi sembra davvero troppo strano, per es. nel caso di tutti 1 o 2 ho letteralmente eseguito migliaia di prove e sono ragionevolmente sicuro che sia corretto.
Ho eseguito test con decine di migliaia di input generati random fino a 100000 cifre, e verificando con un altro eseguibile più lento ed esaustivo … se il risultato fosse stato anche solo 1/100 ci crederei … ma 0/100 !!!
E’ possibile avere anche soltanto un singolo input utilizzato nei test ? giusto per levarmi il dubbio :smiley:

ecco il sorgente inviato

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

vector<string> cosaRimuovere;
string outputNum = "", inputNum = "", numNoMul3 = "";
int resto = 0;

void erase_all_of(string &S, char C) {
  int p = S.find(C);
  while(p>=0) {
    S.erase(p, 1);
    p = S.find(C);
  }
}

void erase_first_of(string &S, char C) {
  int p = S.find(C);
  if(p>=0) S.erase(p, 1);
}

int mod3(string I) {
  int ret=0;
  for (char d: I) ret=(ret+(d-'0'))%3;
  return ret;
}

void rimuovi() {
  if (cosaRimuovere.empty()) {
    outputNum = "-1";
  } else {
    outputNum = "";
    for (string cifre:cosaRimuovere) {
      string soluzione=inputNum;
      for (char c: cifre) erase_first_of(soluzione, c);
      if(soluzione > outputNum) outputNum = soluzione;
    }
    outputNum.erase(0, outputNum.find_first_not_of('0'));
    if (outputNum=="") outputNum = "-1";
  }
}

void combina(int k, int iter, string rimuovi) {
  if (rimuovi.size() < k) {
    for(int i = iter; i < numNoMul3.size(); i++) {
      rimuovi += numNoMul3[i];
      combina(k, i+1, rimuovi);
      rimuovi.erase(rimuovi.end()-1);
    }
  } else {
    if ((resto==mod3(rimuovi)) && (!count(cosaRimuovere.begin(), cosaRimuovere.end(), rimuovi))) cosaRimuovere.push_back(rimuovi);
  }
}

string trova(string I) {
  numNoMul3 = inputNum = I;
  for (char c: {'0','3','6','9'}) erase_all_of(numNoMul3, c);
  resto = mod3(inputNum);
  if (resto) {
    cosaRimuovere.clear();
    for(int i=1; i<3; i++) if (cosaRimuovere.empty()) combina(i, 0, ""); 
    rimuovi();
  } else {
    outputNum = inputNum;
  }
  return outputNum;
}

int main() {
    ifstream cin("input.txt");
    ofstream cout("output.txt");
    int N;
    cin >> N;
    for (int i = 0; i < N; i++) {
      string V, O;
      cin >> V;
      O = trova(V);
      cout << O << endl;
    }
    return 0;
}

Ciao, potresti spiegare meglio la logica del tuo programma? Non sono molto riuscito a seguirla. Comunque ti do un esempio (di circa 45000 sotto 10^6 che ho trovato) di output errato da parte del tuo programma: per l’input

1
212

il tuo programma trova come risposta 12, ma la risposta corretta è 21.

Anche con questi input il tuo programma non da i risultati giusti

1
804440
8040 non 4440

1
100888
1008 non 888