static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256]){
    int i,j,k,m;
    double l2tab[256];

    for(i=1; i<256; i++)
        l2tab[i]= log2(i/256.0);

    for(i=0; i<256; i++){
        double best_len[256];
        double p= i/256.0;

        for(j=0; j<256; j++)
            best_len[j]= 1<<30;

        for(j=FFMAX(i-10,1); j<FFMIN(i+11,256); j++){
            double occ[256]={0};
            double len=0;
            occ[j]=1.0;
            for(k=0; k<256; k++){
                double newocc[256]={0};
                for(m=0; m<256; m++){
                    if(occ[m]){
                        len -=occ[m]*(     p *l2tab[    m]
                                      + (1-p)*l2tab[256-m]);
                    }
                }
                if(len < best_len[k]){
                    best_len[k]= len;
                    best_state[i][k]= j;
                }
                for(m=0; m<256; m++){
                    if(occ[m]){
                        newocc[    one_state[    m]] += occ[m]*   p ;
                        newocc[256-one_state[256-m]] += occ[m]*(1-p);
                    }
                }
                memcpy(occ, newocc, sizeof(occ));
            }
        }
    }
}