Aiuto con ransomware

https://training.olinfo.it/#/task/ois_ransomware/statement Questo è l’esercizio.
Praticamente non riesco a venirne a capo. Riesco a fare il primo esempio ma nel secondo ho un po’ di problemi, e penso che in generale la mia soluzione non sia quella corretta. Qualcuno che mi può dare una mano? Grazie in anticipo

Qui il mio codice:

    cin >> N;
    for (int i = 0; i < N; i++)
        cin >> contacts[i];
    for (int i = 0; i < 10; i++)
        cin >> codes[i];


    
    for (int i = 0; i < N; i++) {
       
        for(int j=0;j<10;j++)
        {   

            numero=to_string(j);
           
            
                while(1)
                {
                    int found = contacts[i].find(codes[j]); 
                    
                    
                    if(found!=string::npos)
                    {   
                       
                        
                        contacts[i].replace(found, codes[j].length(), numero);   
                    }
                    else
                    {
                        break;
                    }
                    
                }
               
        }
        cout<<contacts[i]<<endl;
    }
   
    return 0;
}

Penso ci siano problemi nell’implementazione (per esempio se trovi una sottostringa che corrisponde al codice del numero 3, allora inserisci 3 ma quel 3 poi può viene considerato quando fai la find(), e non dovrebbe). In ogni caso l’idea non funziona.

L’idea è cercare di provarle tutte, tramite programmazione dinamica. Data la stringa s controlli quale dei 10 codici è un suo prefisso, e per ognuno di essi, provi a ““rimuoverlo””, e ripetere lo stesso ragionamento sul suffisso rimanente, eventualmente ci sarà una serie di chiamate ricorsive che ti permetteranno di mappare tutta la stringa.