Witam wszystkich
Napisałem prosty program który kompresuje dane metodą LZW, jednak niestety nie działa do końca tak jak trzeba :/.
Już prawie tydzień próbuje sam rozwiązać problem ale nie mam pojęcia gdzie leży błąd. Mianowicie program kompresuje dane prawidłowo, przy dekompresji krótkich tekstów też wszystko działa OK, problem zaczyna sie pojawiać przy dekompresji większych plików. Zauważyłem że przy dekompresji nagle do słownika zostaje dodany inny znak niż powinien i od tego momentu reszte szlak trafia, wynikiem są częściowe krzaczki i pojemność pliku zdekompresowanego jest o wiele mniejsza niż właściwego ale to chyba wynika z pierwszego problemu.
Zamieszczam kod pętli i prosze o jakieś sugestie

 for(int x = 0; x < len; x++){
           if(bufor[x] < slownik.size() - 1){
                        for(int y = 0; y < slownik.size(); y++){
                                if(bufor[x] == y){       
                                       slownik.push_back(vector < unsigned char> ());
                                       slownik[slownik.size() - 1] = slownik[y];  
                                  
                                       if(x > 0){
                                           slownik[slownik.size() - 2].push_back(slownik[slownik.size() - 1][0]);
                                       }
                                       for(int z = 0; z < slownik[y].size(); z++){
                                                 kontener.push_back(slownik[y][z]);                              
                                       }
                                  }     
                        }
            }
            else{
                 cout << "Tu jest problem" << endl;
                 ciag = slownik[slownik.size() - 1];
                 slownik.push_back(vector <unsigned char> ());
                 slownik[slownik.size() - 1] = ciag;
                 slownik[slownik.size() - 2].push_back(slownik[slownik.size() - 1][0]);
                 slownik[slownik.size() - 1].push_back(slownik[slownik.size() - 2][0]);
           
                 for(int z = 0; z < slownik[slownik.size() - 1].size(); z++){
                                                 kontener.push_back(slownik[slownik.size() - 1][z]);                              
                                       }
               
              
           } 
     ciag.clear();
     
   }

Krótki opis zmiennych:
Słownik jest vectorem vectorów typu unsigned char
Kontener, ciąg jest vectorem unsigned char