AIUTO in Quasi-Isogram (isogram)

Ciao a tutti. Sto provando il problema Quasi-Isogram ma mi da execution killed.
Tentando di inserire l’input nel terminale mi fa inserire soltanto il numero di stringhe e la prima stringa. Poi il programma si blocca e da errore.

Questo è il programma:
(P.S. ho usato lo scheletro fino a getline)

#include <bits/stdc++.h>
using namespace std;

int N;
string S;

int main() {
//  uncomment the following lines if you want to read/write from files
//  ifstream cin("input.txt");
//  ofstream cout("output.txt");

    // input data
    cin >> N;
    cin.ignore();
    int ans;

    for (int i=0; i<N; i++) {
        getline(cin, S);

        //metto tutto minuscolo
        for (int k = 0; k<S.length(); i++) {
            S[i] = tolower(S[i]);
        }

        //sorto in ordine alfabetico (tecnicamente anche se ci sono caratteri speciali funziona e li mette all'inizio)
        sort (S.begin(), S.end());

        //lascio solo le lettere (i caratteri speciali dopo sort stanno all'inizio quindi elimino tutto ciò che sta prima della prima lettera)
        for (int x=0; x<S.length(); x++) {
            if(isalpha(x)==true) {

                S.erase(0, x);
                break;
            }
        }

        //controllo se ci sono tre caratteri consecutivi
        bool isIso = true;
        for (int z=0; z<S.length()-2; z++) {
            if (S[z]==S[z+1] && S[z+1]==S[z+2]) {
                isIso=false;
                break;
            }
        }

        if (isIso = true) ans++;

    }

    cout << ans << endl; // print the result
    return 0;
}

grazie in anticipo

nel loop dove metti tutto in minuscolo stai incrementando i al posto di k, se stai usando vscode ti consiglio di installare mingw come spiegato qui, così potrai se fai segmentation fault il codice si metterà in pausa nel momento dove accade e potrai verificare il valore di tutte le tue variabili in quel momento

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.

3 Mi Piace

Grazie mille per la trattazione che mi hai proposto. Cercherò di ascoltare i tuoi consigli.

1 Mi Piace