Aiuto problema enciclopedia

Ciao, non riesco a capire dove sbaglia il mio programma. Il codice condiviso di seguito totalizza 10/100, facendo giusti solo i casi d’esempio e i testcase 3 e 7.

#include <bits/stdc++.h>

using namespace std;

int n, k;
string lista[10050], memo[10050];
string out;

void init_out()
{
    while(!out.empty())
        out.erase(--out.end());
    return;
}

void primo()
{
    int max_passaggi = min(lista[0].size(), lista[1].size());
    for(int i=0; i < max_passaggi; i++)
    {
        if(lista[0][i] != lista[1][i])
        {
            out += toupper(lista[0][i]);
            break;
        }
        out += toupper(lista[0][i]);
    }
    if(out.size() == lista[1].size())
        out+= toupper(lista[0][out.size()]);
    memo[0] = out;
    init_out();
    return;
}

void ultimo()
{
    int max_passaggi = min(lista[n-2].size(), lista[n-1].size());
    for(int i=0; i < max_passaggi; i++)
    {
        if(lista[n-2][i] != lista[n-1][i])
        {
            out += toupper(lista[n-1][i]);
            break;
        }
        out += toupper(lista[n-1][i]);
    }
    if(out.size() == lista[n-2].size())
        out+= toupper(lista[n-1][out.size()]);
    memo[n-1] = out;
    init_out();
    return;
}

void calcola(int index)
{
    int max_passaggi = min(lista[index].size(), lista[index-1].size());
    int length_before = 0;
    for(int j=0; j< max_passaggi; j++)
    {
        if(lista[index][j] != lista[index-1][j])
        {
            length_before++;
            break;
        }
        length_before++;
    }

    if(length_before == lista[index-1].size())
        length_before++;

    int length_after = 0;
    max_passaggi = min(lista[index].size(), lista[index+1].size());
    for(int j=0; j< max_passaggi; j++)
    {
        if(lista[index][j] != lista[index+1][j])
        {
            length_after++;
            break;
        }
        length_after++;
    }
    if(length_after == lista[index+1].size())
        length_after++;
    int att = max(length_before, length_after);
    for(int i=0; i<att; i++)
        out += toupper(lista[index][i]);
    memo[index] = out;
    init_out();
    return;
}

int main(){

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    cin >> n >> k;
    for(int i=0; i<n; i++)
    {
        cin >> lista[i];
    }
    primo();
    for(int i=1; i<n-1; i++)
        calcola(i);
    ultimo();

    for(int i=0; i<n; i+=k)
    {
        cout << memo[i] << "-" << memo[i+k-1] << endl;
    }
    return 0;
}

Il mio programma calcola per ogni stringa il minimo prefisso che devo prendere affinche’ la stringa I sia distinguibile univocamente dalla precedente e dalla successiva. Per la prima stringa controllo solamente quella successiva, mentre per l’ultima controllo solamente la precedente. Alla fine vado ad usare solo le stringhe che mi servono.
Grazie in anticipo

Prova questo input:

8 4
anatra
anatre
attivo
barbabietola
bicchiere
bicchieri
calcio
cerchio
1 Mi Piace

L’ output che da il mio codice e’:
ANATRA-BA
BICCHIERE-CE

e mi pare corretto, vero?

Dovrebbe essere:

A-BA
BI-C
1 Mi Piace

A sto punto immaginavo di aver capito male il problema :sweat_smile:.
Grazie mille @bortoz

Ciao, ho letto il testo e non capisco bene come vengano presi questi prefissi…
ho capito che prendo *p quando non è prefisso di q e viceversa, però:

  • nell’esempio che hai dato tu il secondo output perché è “BI-C” e non “B-C”?
  • nell’esempio del testo, perché tra “anello barca calamaro” viene fuori “A-CALA” e non “A-CA”?