Ois 2016 Faster

Ciao a tutti! Premetto che in gara avevo preso 100/100, la mia prima volta in competizione tra l’altro, ma mi ero dimenticato di incollare il codice su pastebin o comunque di mandarmelo quindi ho dovuto rifarlo da capo.
Dopo innumerevoli tentativi il massimo che ho ottenuto è un misero 30/100 (tutte le paroli uguali alla trigger word), neanche i punti degli esempi lol. Sono sicuro che c’è un errore banale da qualche parte ma non riesco a trovarlo, ho anche riprovato a farlo da capo a distanza di giorni ma niente.

TL;DR non riesco a spottare un errore probabilmente stupidissimo, grazie in anticipo, scusate la nabbaggine:innocent:

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



int main (){

    /*freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    ios_base::sync_with_stdio(false);*/

    string s;
    int n,vist=1,v0,t=0;
    cin>>s>>n;
    string a[n];

    for(int i=0; i<n; i++){
        cin>>a[i];
    }

    for(int i=0; i<n; i+v0){
        if(i+vist>=n){cout<<t; return 0;}
        v0=vist;
        for(int j=0; j<(i+v0); j++){
            if(a[j]==s) vist++;
        }
        
        t++;
    }

    cout<<t;

    return 0;
}

Ci sono diversi (piccoli) problemi:

  • Controlla bene l’operazione di incremento di questo ciclo for: for(int i=0; i<n; i+v0)
  • Sei sicuro che in questo caso la risposta sia t? if(i+vist>=n){cout<<t; return 0;
  • Ricontrolla anche questo ciclo for, prestando particolare attenzione alla differenza tra
    • Quante volte deve essere eseguito il ciclo
    • Quali posizioni dell’array a devono essere controllate
        for(int j=0; j<(i+v0); j++){
            if(a[j]==s) vist++;
        }

Una volta sistemati questi problemi, la soluzione è corretta.

Grazie della risposta, però sono ancora un po’ perplesso:

  • Nel ciclo for(int i=0; i<n; i+v0) l’incremento mi sembra giusto(anche se a quanto pare non lo è) perché, chiamando i l’indice della prima parola controllata a un dato t, i aumenta di un numero uguale al numero di parole controllate nel secondo precedente.

  • Giusto, non è t bensì t+1 perché arrotonda per eccesso la durata, ops :sweat_smile:

  • In questo ciclo j parte da i, non da 0, quindi ogni secondo controlla v0 parole partendo da i, quindi fino a i+v0-1,così mi sembra giusto :disappointed_relieved:

for(int j=i; j<(i+v0); j++){ if(a[j]==s) vist++; }

La seconda e la terza correzione sono esatte. Ben fatto!

Ti manca solo l’incremento nel ciclo: attento alla differenza tra

i + v0     // Calcolo i + v0 ma non salvo il risultato
i = i + v0 // Calcolo i + v0 e salvo il risultato in i
i += v0    // Aggiungo v0 ad i

La terza istruzione è una scorciatoia sintattica della seconda (e quindi sono equivalenti). La prima non lo è :wink:

Questo problema deve avermi fuso la testa, ogni volta che controllavo quel passaggio mi sembrava giusto :sweat_smile:
Adesso va, grazie mille!