Allora mi son serviti 15 min per capire bene i vari problemi, Sono d’accordissimo sul consiglio di @Shater36, io ho capito così dov’erano i problemi, ma comunque mi sembrava giusto farti notare perché posso capire che se non si sa usare il debug è fastidiosissimo (ma in quel caso almeno il debug “manuale” dove ti stampi le variabili per capire che succede dovresti farlo, anche perché ti dico che la maggior parte sono errori di distrazione, magari ci stavi da tanto ed eri stanco per riguardarlo non so, ma sono erroracci davvero banali).
Partiamo dal primo: “Perché mi da execution killed??”
Il tuo algoritmo returna questo errore perché contiene un ciclo infinito all’interno.
for (int k = 0; k < S.length(); i++) {
S[i] = tolower(S[i]);
}
Qui ti sei confuso un po’ con le variabili, hai dichiarato nel for la variabile k per poi aumentare e utilizzare la i…
dopo di che, il tuo algoritmo sbaglia anche qui:
for (int x=0; x<S.length(); x++) {
if(isalpha(x)==true) {
S.erase(0, x);
break;
}
}
il primo erroraccio è fare isalpha(x), x è l’indice, non il carattere.
poi c’è un errore meno banale che è invece questo:
if(isalpha(S[x])==true) // ho sostituito x con S[x]
la funzione isalpha restituisce una Non-zero value nel caso in cui il carattere è classificato come alfabetico, e 0 altrimenti. Questo significa che nell’espressione la confronti con true, che equivale ad 1, quindi isalpha(S[x])
ti restituisce valori diversi da 0 ma non necessariamente uguali ad 1. Non ho approfondito molto, ma ti posso dire che nel mio caso restituiva sempre 2, facendo diventare così l’espressione: if( 2 == 1 )
.
Per risolvere basta scrivere
if ( isalpha(S[x]) )
così entrerà nell’if con ogni numero diverso da 0.
Un altro errore banalissimo è:
if (isIso = true) ans++;
Con un solo uguale assegni isIso = true, non li compari.
Questo è un altro errore che se stavi 10 min in più a riguardare l’algoritmo lo trovavi instant.
Infine il tuo algoritmo così non fa nemmeno 100/100, perchè non ti va la subtask 2, visto che le stringhe possono essere più piccole di 3 caratteri, quindi l’espressione S.lenght() - 2
può essere negativa, visto che S.lenght() è di tipo size_t, quindi non può assumere valori negativi, quando fai S.lenght() - 2
con S.lenght() = 1 allora l’operazione ti returna un numero vicino al size_t_MAX. Quindi entri nel for quando non devi e si bugga tutto.
Basta un semplice casting per risolvere.
Non è mio intento fare lo sbruffone o cose del genere, questi errori li ho fatti anche io, e mi capita ancora di farli, mi sono trovato anch’io in situazioni disperate dove trovavo nel forum l’ultima spiaggia, ma cerca di capire bene quando è l’ultima spiaggia e quando no. Sbattere la testa sugli algoritmi fin quando non funzionano è il miglior modo per migliorare. Ovviamente quando ci sono errori un po’ più tecnici oppure quando davvero ci stai lavorando da tanto, lì è perfettamente sensato chiedere. Il mio consiglio è quello di trovare un giusto equilibrio, te lo dico perché se ti riguardi bene l’algoritmo ti alleni pure a trovare gli errori e magari a qualche gara riesci a debuggare subito e fare 100/100.
Detto questo spero di esser stato di aiuto, buona serata.