// src: http://t...content-available-to-author-only...i.com/cubecontest/winners.html 
// By: Tomas Sirgedas, Ann Arbor, MI, USA 
// fix by noski , Pete Lomax
#include <string.h> 
#include <iostream> 
using std :: string; 
using std :: cout; 
using std :: swap; 
using std :: endl; 
string data = "2#6'&78)5+1/AT[NJ_PERLQO@IAHPNSMBJCKLRMSDHEJNPOQFKGIQLSNF@DBROPMAGCEMPOACSRQDF";
char inva[48], b[48], cur_phase, search_mode, history_idx, history_mov[48], history_rpt[48], depth_to_go[5<<20], hash_table[48][6912];

struct Cubelet { 
  char pos, twi; 
} cubelet [48]; 

int min(unsigned int a, unsigned int b) { 
    return a <b ? a : b; 
} 

void rot(char cur_phase) { 
    if (cur_phase <4) {
        for (int i = -1; ++i<4;) {
            cubelet[64^data[20+cur_phase*8+i]].twi = (cubelet[64^data[20+cur_phase*8+i]].twi+2-i%2) % 3;
            cubelet[64^data[20+cur_phase*8+i+4]].twi ^= cur_phase <2; 
        }
    } 
    for (int i = -1; ++i<7;) {
        swap(cubelet[64^data[20+cur_phase*8+i+(i!=3)]], cubelet[64^data[20+cur_phase*8+i]]); 
    }
}

int hashf() { 
    int ret = 0; 
    switch (cur_phase) { 
        case 0: 
                for (int i = -1; ++i<11;) {
                    ret += ret + cubelet[i].twi; 
                }
                return ret; 
        case 1: 
                for (int i = -1; ++i<7;) {
                    ret = ret*3 + cubelet[i+12].twi; 
                }
                for (int i = -1; ++i<11;) {
                    ret += ret + (cubelet[i].pos>7); 
                }
                return ret-7; 
        case 2: 
                for (int i = -1; ++i<8;) {
                    if (cubelet[i+12].pos<16) {
                        inva[cubelet[i+12].pos&3] = ret++; 
                    }
                    else
                    {
                        b[i-ret] = cubelet[i+12].pos&3; 
                    }
                }
                for (int i = -1; ++i<7;) {
                    ret += ret + (cubelet[i].pos>3); 
                }
                for (int i = -1; ++i<7;) {
                    ret += ret + (cubelet[i+12].pos>15); 
                }
                return ret*54 + (inva[b[0]] ^ inva[b[1]])*2 + ((inva[b[0]] ^ inva [b[2]]) > (inva[b[0]] ^ inva[b[3]])) - 3587708; 
    } 
    for (int i = -1; ++i<5;) { 
        ret *= 24; 
        for (int cp = -1; ++cp<4;) {
            for (int k = -1; ++k<cp;) {
                if (cubelet[i*4+cp].pos < cubelet[i*4+k].pos) {
                    //ret += cp << cp / 3; 
                    ret += cp + (cp==3?cp:0);
                }
            }
        }
    } 
    return ret / 2; 
} 

int do_search(int dpt) { 
    int h = hashf(), 
        q = (cur_phase/2*19+8)<<7; 
//if (dpt<1 && cur_phase==0) {
  //  cout << "do_search(" << dpt << " (cp=" << (int)cur_phase << ")) " << h << " " << q << endl;
//}
    if ((dpt < hash_table[cur_phase][h%q] | dpt < hash_table[cur_phase+4][h/q]) ^ search_mode) { 
        if (search_mode) {
            if (dpt <= depth_to_go[h]) {
                return ! h; 
            }
            else {
                depth_to_go[h] = dpt; 
            }
        }
        if (hash_table[cur_phase][h%q] > dpt) 
            hash_table[cur_phase][h%q] = dpt; 
        if (hash_table[cur_phase+4][h/q] > dpt) 
            hash_table[cur_phase+4][h/q] = dpt; 
        for (int k = -1; ++k<6;) {
            for (int i = -1; ++i<4;) { 
                rot(k); 
                if (k < cur_phase*2 & i!=1 || i>2) 
                    continue; 
                history_mov[history_idx] = k; 
                history_rpt[history_idx++] = i; 
                if (do_search(dpt-search_mode*2+1)) 
                    return 1; 
                history_idx--; 
            } 
        }
    } 
    return 0; 
} 

/*
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DRF", "DFL", "DLB", "DBR", NULL};       // (solved)
const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "UF", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "URB", "UBL", "ULF", "UFR", "DRF", "DFL", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "UR", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "UBL", "ULF", "UFR", "URB", "DRF", "DFL", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "UR", "UB", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "ULF", "UFR", "URB", "UBL", "DRF", "DFL", "DLB", "DBR", NULL};
*/
/*
const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "RF", "DR", "DB", "DL", "FU", "FD", "BR", "BL", "LFU", "URB", "UBL", "LDF", "RUF", "RFD", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "DF", "UR", "UB", "UL", "UF", "DR", "DB", "DL", "FL", "FR", "BR", "BL", "DFL", "URB", "UBL", "DRF", "ULF", "UFR", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "LF", "DR", "DB", "DL", "FD", "FU", "BR", "BL", "RFD", "URB", "UBL", "RUF", "LDF", "LFU", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UF", "FR", "UB", "UL", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "FDR", "FRU", "UBL", "ULF", "BRD", "DFL", "DLB", "BUR", NULL};
const char *argv[] = {"rubik.exe", "UF", "DR", "UB", "UL", "DF", "UR", "DB", "DL", "BR", "FL", "FR", "BL", "DBR", "DRF", "UBL", "ULF", "URB", "DFL", "DLB", "UFR", NULL};
const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "UL", "DF", "FR", "DB", "DL", "UR", "FL", "DR", "BL", "BUR", "BRD", "UBL", "ULF", "FRU", "DFL", "DLB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DL", "DF", "DR", "DB", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DFL", "DLB", "DBR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DB", "DL", "DF", "DR", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DLB", "DBR", "DRF", "DFL", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DR", "DB", "DL", "DF", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DBR", "DRF", "DFL", "DLB", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "RB", "UL", "DF", "DR", "LB", "DL", "FR", "FL", "BD", "BU", "UFR", "RDB", "RBU", "ULF", "DRF", "DFL", "LUB", "LBD", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "DB", "UL", "DF", "DR", "UB", "DL", "FR", "FL", "BL", "BR", "UFR", "DLB", "DBR", "ULF", "DRF", "DFL", "URB", "UBL", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "LB", "UL", "DF", "DR", "RB", "DL", "FR", "FL", "BU", "BD", "UFR", "LUB", "LBD", "ULF", "DRF", "DFL", "RDB", "RBU", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "DF", "DR", "DB", "FL", "FR", "UL", "BR", "DL", "UFR", "URB", "BDL", "BLU", "DRF", "FUL", "FLD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "DL", "DF", "DR", "DB", "UL", "FR", "BL", "BR", "FL", "UFR", "URB", "DFL", "DLB", "DRF", "UBL", "ULF", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "FL", "DF", "DR", "DB", "BL", "FR", "DL", "BR", "UL", "UFR", "URB", "FUL", "FLD", "DRF", "BDL", "BLU", "DBR", NULL};
const char *argv[] = {"rubik.exe", "LB", "UL", "UF", "UR", "DF", "DR", "RB", "DL", "FR", "FL", "BU", "BD", "LBD", "ULF", "UFR", "LUB", "DRF", "DFL", "RDB", "RBU", NULL};
const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "DL", "DF", "DR", "DB", "UF", "FR", "BL", "BR", "FL", "URB", "UBL", "DFL", "DLB", "DRF", "ULF", "UFR", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UL", "BR", "UR", "UB", "DF", "FR", "DB", "DL", "UF", "FL", "DR", "BL", "RUF", "BRD", "URB", "UBL", "LFU", "DFL", "DLB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "FL", "DF", "DR", "DB", "FR", "UL", "BR", "DL", "UFR", "URB", "BDL", "BLU", "FUL", "FLD", "DBR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "DL", "UL", "DF", "DR", "DB", "FR", "BL", "BR", "FL", "UFR", "URB", "DFL", "DLB", "UBL", "ULF", "DBR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "DB", "DL", "LF", "DR", "FD", "FU", "BR", "BL", "RFD", "URB", "UBL", "RUF", "DLB", "DBR", "LDF", "LFU", NULL};
const char *argv[] = {"rubik.exe", "LF", "DR", "UB", "UL", "RF", "UR", "DB", "DL", "BR", "FD", "FU", "BL", "DBR", "RUF", "UBL", "LDF", "URB", "RFD", "DLB", "LFU", NULL};
const char *argv[] = {"rubik.exe", "DF", "FL", "UB", "UL", "UF", "BR", "DB", "DL", "DR", "FR", "UR", "BL", "FUL", "FLD", "UBL", "DRF", "BRD", "UFR", "DLB", "BUR", NULL};
const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "UR", "DL", "DF", "DR", "DB", "FR", "FL", "BR", "BL", "UBL", "ULF", "UFR", "URB", "DFL", "DLB", "DBR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "UF", "DR", "UB", "BL", "DF", "UR", "DB", "FL", "BR", "UL", "FR", "DL", "DBR", "DRF", "BDL", "BLU", "URB", "FUL", "FLD", "UFR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "DL", "DF", "DR", "FL", "FR", "UL", "BR", "DB", "UFR", "URB", "RDB", "BLU", "DFL", "FUL", "LBD", "DRF", NULL};
const char *argv[] = {"rubik.exe", "DF", "UR", "UB", "UL", "DR", "DB", "DL", "UF", "FL", "FR", "BR", "BL", "DFL", "URB", "UBL", "DRF", "DBR", "ULF", "UFR", "DLB", NULL};
const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "FR", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "UBL", "ULF", "FDR", "FRU", "BRD", "DFL", "DLB", "BUR", NULL};
const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "BL", "DF", "DR", "DB", "FL", "FR", "UF", "BR", "DL", "URB", "UBL", "BDL", "LFU", "DRF", "RUF", "FLD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "DR", "UB", "DF", "UR", "DB", "DL", "BR", "FL", "FR", "BL", "ULF", "DBR", "DRF", "UBL", "URB", "DFL", "DLB", "UFR", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "FR", "UB", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "ULF", "FDR", "FRU", "UBL", "BRD", "DFL", "DLB", "BUR", NULL};
const char *argv[] = {"rubik.exe", "RF", "UL", "UF", "UR", "LF", "DR", "DB", "DL", "FD", "BU", "BR", "BL", "RFD", "ULF", "UFR", "LUB", "LDF", "RBU", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "BR", "DF", "FR", "DB", "DL", "UR", "FL", "DR", "BL", "UBL", "ULF", "BUR", "BRD", "FRU", "DFL", "DLB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "DR", "UR", "UB", "UL", "LF", "DB", "DL", "RF", "FD", "FU", "BR", "BL", "RUF", "URB", "UBL", "DBR", "LDF", "LFU", "RFD", "DLB", NULL};
const char *argv[] = {"rubik.exe", "DR", "UL", "UF", "UR", "UB", "DB", "DL", "DF", "FL", "FR", "BR", "BL", "DRF", "ULF", "UFR", "DBR", "URB", "UBL", "DFL", "DLB", NULL};
const char *argv[] = {"rubik.exe", "UF", "FR", "UB", "BL", "DB", "DL", "DF", "FL", "DR", "UL", "UR", "BR", "FDR", "FRU", "DBR", "BLU", "DLB", "FUL", "URB", "DFL", NULL};
const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "UL", "DR", "DB", "DL", "FR", "UR", "FL", "DF", "BL", "BUR", "RFD", "UBL", "ULF", "DBR", "LDF", "FRU", "DLB", NULL};
const char *argv[] = {"rubik.exe", "RD", "FR", "DB", "UL", "LF", "BL", "UB", "DL", "FD", "FU", "UR", "BR", "LUB", "FRU", "DBR", "RFD", "LDF", "LFU", "URB", "BDL", NULL};
const char *argv[] = {"rubik.exe", "DF", "UR", "DB", "FR", "UF", "DR", "UB", "BR", "FL", "DL", "BL", "UL", "DFL", "DLB", "FDR", "FRU", "ULF", "BUR", "BRD", "UBL", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "DR", "LB", "DF", "UR", "RB", "DL", "BU", "FL", "FR", "BD", "ULF", "RBU", "DRF", "LBD", "LUB", "DFL", "RDB", "UFR", NULL};
const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "RB", "DR", "DB", "DL", "FR", "FD", "FU", "BL", "UFR", "RDB", "UBL", "LDF", "DRF", "RBU", "DLB", "LFU", NULL};
const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "DB", "DL", "DF", "FR", "UL", "UR", "BL", "DR", "FL", "BUR", "BRD", "DLB", "FDR", "DFL", "UBL", "ULF", "FRU", NULL};
const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "LB", "DR", "DB", "DL", "FD", "FL", "BR", "FU", "RFD", "URB", "LBD", "ULF", "LUB", "DFL", "RUF", "DBR", NULL};
const char *argv[] = {"rubik.exe", "LF", "BU", "LB", "UL", "RU", "FR", "RB", "DL", "FU", "FD", "DR", "BD", "LFU", "BUR", "LBD", "LDF", "UBL", "RUF", "RDB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "DR", "UB", "UL", "BL", "DF", "UR", "DB", "FL", "BR", "UF", "FR", "DL", "DRF", "UBL", "BDL", "LFU", "URB", "RDB", "FLD", "UFR", NULL};
const char *argv[] = {"rubik.exe", "UF", "BR", "LB", "BD", "DF", "FR", "RD", "FL", "UR", "UL", "BU", "DL", "BUR", "LUB", "DRF", "BDL", "FRU", "FUL", "FLD", "RDB", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "DB", "UB", "DF", "FR", "BR", "DL", "UR", "FL", "BL", "DR", "ULF", "DLB", "FDR", "UBL", "FRU", "DFL", "BUR", "BRD", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "RB", "BU", "DF", "DR", "LF", "BL", "FR", "DL", "BD", "UL", "UFR", "RDB", "FLD", "BUR", "DRF", "BDL", "BLU", "LFU", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "DB", "FL", "DR", "UB", "BL", "DF", "FR", "DL", "UL", "BR", "UFR", "BLU", "DBR", "FLD", "FUL", "DRF", "BDL", "URB", NULL};
const char *argv[] = {"rubik.exe", "DF", "BR", "RD", "UL", "UF", "FL", "LB", "DL", "UR", "FR", "BD", "BU", "BUR", "LFU", "RDB", "DRF", "FLD", "UFR", "LUB", "LBD", NULL};
const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "DF", "DR", "DB", "RF", "FU", "LD", "BR", "BL", "LFU", "URB", "UBL", "BDL", "DRF", "RUF", "FLD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "RU", "LF", "BL", "FR", "BR", "DB", "FD", "LD", "DR", "FU", "UB", "LU", "LDF", "BLU", "FRU", "DBR", "LBD", "DRF", "ULF", "RBU", NULL};
const char *argv[] = {"rubik.exe", "UF", "BD", "BL", "FL", "RB", "UB", "DR", "UL", "RF", "RU", "FD", "LD", "LDF", "LBD", "RUF", "FDR", "DBR", "LFU", "BUR", "LUB", NULL};
const char *argv[] = {"rubik.exe", "DF", "FU", "DB", "BL", "LF", "LU", "DR", "UR", "FR", "LD", "BR", "UB", "DFL", "ULF", "UFR", "BRD", "LUB", "DRF", "BUR", "LBD", NULL};
const char *argv[] = {"rubik.exe", "LU", "UB", "DR", "FR", "UF", "FL", "DL", "DF", "BD", "LB", "RU", "BR", "FUL", "BLU", "FRU", "DLB", "URB", "BRD", "RFD", "DFL", NULL};
const char *argv[] = {"rubik.exe", "RF", "RB", "LU", "FD", "FU", "FL", "LD", "RD", "DB", "UR", "BL", "BU", "RFD", "RUF", "LDF", "LUB", "ULF", "URB", "LBD", "BRD", NULL};
const char *argv[] = {"rubik.exe", "FL", "LU", "RU", "DL", "FU", "FR", "RD", "UB", "RB", "DB", "FD", "BL", "ULF", "RFD", "BDL", "FLD", "BUR", "FRU", "BRD", "BLU", NULL};
const char *argv[] = {"rubik.exe", "LU", "FD", "FL", "FU", "DR", "BD", "UB", "LB", "RB", "DL", "UR", "FR", "LBD", "UFR", "RFD", "BLU", "BUR", "ULF", "FLD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "LB", "RB", "FU", "DF", "UB", "DB", "DL", "UR", "FR", "LF", "UL", "DR", "BDL", "UBL", "RUF", "FLD", "RDB", "ULF", "URB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "FD", "FL", "UF", "UL", "UR", "DB", "DR", "BU", "BR", "FR", "LB", "LD", "DLB", "UFR", "LUB", "FUL", "BUR", "DRF", "BRD", "LDF", NULL};
const char *argv[] = {"rubik.exe", "UB", "UR", "UL", "DF", "DB", "LD", "RF", "BR", "LF", "RD", "BL", "UF", "BLU", "FDR", "BDL", "FUL", "RUF", "BRD", "DFL", "BUR", NULL};
const char *argv[] = {"rubik.exe", "LF", "UB", "UF", "DF", "UR", "DB", "RB", "UL", "RD", "RF", "LB", "LD", "BDL", "BRD", "LDF", "UFR", "BUR", "UBL", "LFU", "RFD", NULL};
const char *argv[] = {"rubik.exe", "DF", "FR", "UB", "BD", "FU", "BL", "RU", "BR", "RD", "DL", "LU", "LF", "DBR", "RUF", "BDL", "UBL", "RFD", "FLD", "BUR", "LFU", NULL};
const char *argv[] = {"rubik.exe", "FU", "FR", "RU", "LU", "LD", "BL", "FL", "RB", "UB", "BD", "RD", "FD", "FDR", "FUL", "FRU", "BDL", "LUB", "RDB", "URB", "FLD", NULL};
const char *argv[] = {"rubik.exe", "LD", "DF", "FR", "BR", "UF", "RU", "UB", "FL", "RD", "LB", "UL", "DB", "LDF", "BRD", "FRU", "LFU", "BDL", "RFD", "BUR", "LUB", NULL};
const char *argv[] = {"rubik.exe", "BD", "BU", "RU", "DL", "DF", "BL", "FR", "FL", "LU", "DR", "BR", "UF", "LDF", "LBD", "URB", "FUL", "BRD", "RUF", "UBL", "RFD", NULL};
const char *argv[] = {"rubik.exe", "FR", "LU", "BU", "DL", "BD", "UF", "UR", "BL", "FL", "FD", "BR", "DR", "RFD", "RUF", "BRD", "DFL", "LFU", "LBD", "UBL", "URB", NULL};
const char *argv[] = {"rubik.exe", "LU", "FU", "RU", "DF", "LB", "RB", "DL", "BD", "LF", "RD", "RF", "BU", "BRD", "DFL", "RBU", "LUB", "DLB", "LFU", "FDR", "RUF", NULL};
const char *argv[] = {"rubik.exe", "UB", "DF", "BD", "UF", "LB", "LF", "LU", "UR", "LD", "RD", "BR", "FR", "RBU", "LBD", "FDR", "UBL", "LFU", "DBR", "LDF", "RUF", NULL};
const char *argv[] = {"rubik.exe", "RB", "UB", "RF", "LF", "UF", "RD", "BL", "DL", "RU", "DF", "DB", "LU", "RFD", "LFU", "LDF", "RUF", "UBL", "RDB", "LBD", "URB", NULL};
const char *argv[] = {"rubik.exe", "FR", "LB", "FD", "FU", "DR", "BR", "LU", "BD", "UR", "BU", "LF", "LD", "LUB", "LFU", "BDL", "DBR", "DRF", "RBU", "FLD", "RUF", NULL};
const char *argv[] = {"rubik.exe", "UL", "DL", "RF", "UB", "FD", "BR", "DB", "UF", "DR", "UR", "BL", "FL", "FDR", "BLU", "DLB", "URB", "RUF", "FLD", "BRD", "FUL", NULL};
const char *argv[] = {"rubik.exe", "RU", "BU", "FL", "RD", "BD", "FR", "LU", "FD", "FU", "DL", "BL", "RB", "RUF", "DFL", "UBL", "ULF", "URB", "BDL", "DBR", "FDR", NULL};
const char *argv[] = {"rubik.exe", "RF", "DL", "BL", "LF", "DB", "BR", "FD", "BU", "RD", "FU", "RU", "LU", "URB", "LUB", "RFD", "DFL", "FRU", "BDL", "DBR", "ULF", NULL};
const char *argv[] = {"rubik.exe", "RU", "FL", "FR", "FU", "DL", "RD", "UB", "BD", "UL", "FD", "BL", "RB", "BDL", "BRD", "UFR", "FDR", "BLU", "RBU", "FLD", "LFU", NULL};
const char *argv[] = {"rubik.exe", "RF", "FU", "BU", "FL", "UL", "LD", "RB", "DB", "BL", "FD", "RU", "RD", "BRD", "RUF", "DLB", "UBL", "DFL", "LFU", "URB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "FR", "RU", "UF", "LF", "BD", "LU", "BU", "DL", "RB", "FD", "LB", "DR", "FLD", "RUF", "BLU", "RFD", "DBR", "LFU", "LBD", "BUR", NULL};
const char *argv[] = {"rubik.exe", "FL", "RD", "BR", "UB", "UR", "DF", "BL", "UL", "FU", "BD", "DL", "RF", "ULF", "UBL", "FRU", "URB", "DRF", "BRD", "FLD", "DLB", NULL};
const char *argv[] = {"rubik.exe", "BR", "LU", "UB", "BL", "FR", "RD", "FL", "FD", "BD", "UF", "UR", "DL", "DBR", "BUR", "FLD", "LUB", "RFD", "FRU", "ULF", "BDL", NULL};
const char *argv[] = {"rubik.exe", "UL", "DF", "LB", "RU", "BR", "UF", "BD", "LD", "LF", "BU", "DR", "FR", "FRU", "BUR", "LDF", "DRF", "UBL", "RDB", "BDL", "ULF", NULL};
const char *argv[] = {"rubik.exe", "UB", "FR", "LU", "RD", "RU", "UF", "LF", "RB", "LB", "DF", "LD", "BD", "RFD", "BDL", "ULF", "LUB", "LDF", "BUR", "RUF", "BRD", NULL};
const char *argv[] = {"rubik.exe", "BR", "FD", "UF", "LB", "UL", "UB", "RF", "DR", "FL", "RU", "LD", "BD", "UBL", "ULF", "RUF", "FLD", "BDL", "RDB", "BUR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "RU", "FR", "LB", "DL", "BD", "DF", "LF", "BR", "UF", "UL", "DR", "UB", "DFL", "BLU", "BRD", "UFR", "LBD", "ULF", "FDR", "RBU", NULL};
const char *argv[] = {"rubik.exe", "LD", "LU", "DF", "LB", "UR", "FL", "DR", "BR", "FR", "UF", "UB", "BD", "DFL", "DRF", "LUB", "LFU", "DLB", "RUF", "DBR", "RBU", NULL};
const char *argv[] = {"rubik.exe", "LB", "DB", "RU", "DF", "LU", "BU", "RF", "RB", "UF", "RD", "DL", "LF", "DLB", "LFU", "FLD", "RDB", "FDR", "BLU", "BUR", "UFR", NULL};
const char *argv[] = {"rubik.exe", "DR", "DB", "BU", "DL", "BL", "DF", "BR", "FL", "UL", "UR", "FR", "FU", "ULF", "UFR", "DBR", "DFL", "BLU", "BUR", "BDL", "RFD", NULL};
const char *argv[] = {"rubik.exe", "DB", "DL", "DF", "UF", "UB", "FR", "LB", "DR", "UL", "LF", "UR", "BR", "DRF", "LDF", "UFR", "BRD", "DLB", "RBU", "UBL", "FUL", NULL};
const char *argv[] = {"rubik.exe", "BL", "DF", "UL", "RB", "BD", "UR", "UB", "FL", "LD", "DR", "RF", "UF", "URB", "LBD", "LFU", "RFD", "BRD", "BLU", "FRU", "DFL", NULL};
const char *argv[] = {"rubik.exe", "UL", "DR", "BU", "BL", "DF", "LD", "BR", "DB", "LF", "RF", "FU", "RU", "BLU", "URB", "LBD", "FDR", "DFL", "DBR", "LFU", "FRU", NULL};
const char *argv[] = {"rubik.exe", "UR", "BL", "DB", "RB", "FL", "UB", "DL", "UF", "DF", "RF", "RD", "LU", "DFL", "BLU", "FDR", "LBD", "BUR", "UFR", "LFU", "RDB", NULL};
const char *argv[] = {"rubik.exe", "DL", "LU", "FU", "BD", "RD", "FR", "RB", "BL", "FD", "UR", "FL", "UB", "BDL", "FLD", "ULF", "RBU", "FRU", "RDB", "BLU", "RFD", NULL};
const char *argv[] = {"rubik.exe", "UB", "FU", "LU", "DL", "RB", "DB", "LB", "RF", "FD", "RU", "LF", "DR", "FRU", "DRF", "BLU", "BUR", "BRD", "DLB", "FLD", "ULF", NULL};
const char *argv[] = {"rubik.exe", "UR", "FU", "DL", "UL", "BL", "LF", "FD", "UB", "RB", "FR", "DR", "DB", "UFR", "BLU", "BUR", "FLD", "DLB", "LFU", "RFD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "RB", "UF", "DF", "FR", "DL", "DR", "UL", "UR", "UB", "BL", "FL", "BD", "FLD", "RDB", "BLU", "BUR", "RUF", "RFD", "LBD", "FUL", NULL};
const char *argv[] = {"rubik.exe", "BD", "LU", "UB", "DL", "DR", "BL", "RF", "DF", "BR", "UF", "LF", "UR", "FLD", "LUB", "RUF", "LBD", "RDB", "ULF", "DRF", "RBU", NULL};
const char *argv[] = {"rubik.exe", "RU", "LF", "RD", "RF", "FU", "UL", "BD", "DF", "RB", "LB", "BU", "LD", "LBD", "URB", "LUB", "DRF", "ULF", "FLD", "RDB", "UFR", NULL};
*/
const char *argv[] = {"rubik.exe", "UL", "DB", "BR", "FL", "BL", "DR", "FD", "RU", "FR", "UB", "LD", "FU", "FDR", "FUL", "BDL", "RBU", "FLD", "RUF", "DBR", "LUB", NULL};
/*
*/
int argc = sizeof(argv) / sizeof(char*) - 1;
int main () { 
    if (argc != 21) { 
        cout << endl 
             << "### Input Error. Argument Format:" << endl 
             << argc << endl
             << argv << endl
             << "rubik.exe UF UR UB UL DF DR DB DL FR FR BR BR UFR URB UBL ULF DRF DFL DLB DBR" << endl; 
        return 0; 
    } 
    memset(hash_table, 6, sizeof(hash_table)); 
    for (int i = -1; ++i<20;) {
        cubelet[i].pos = i; 
    }
    for (cur_phase = -1; ++cur_phase<4;) {
        do_search(0); 
    }
    for (int i = -1; ++i<20;) { 
        string s = argv [i + 1] + string ("!"); 
        cubelet[i].pos = data.find(s[0] ^ s[1] ^ s[2]); 
        int x = min(s.find('U'), s.find('D')); 
        cubelet[i].twi = ~ x? x: s[0]>'F'; 
//cout << "cubelet(" << i << ") = {" << (int)cubelet[i].pos << "," << (int)cubelet[i].twi << "}" << endl;
    } 
    for (int i = -1; ++i<5;) {
        int j = 64^data[20+cur_phase*8+i+16],
            k = 64^data[20+cur_phase*8+i+21];
        swap(cubelet[j], cubelet[k]);
        //cout << "swap(" << j << "," << k << ")" << endl;
    }
//    for (int i = -1; ++i<20;) { 
//cout << "cubelet(" << i << ") = {" << (int)cubelet[i].pos << "," << (int)cubelet[i].twi << "}" << endl;
//    } 

    search_mode = 1; 
    for (cur_phase = -1; ++cur_phase<4;) {
  //      cout << (int)cur_phase << endl; 
        for (int i = -1; ++i<20;) {
    //        cout << (int)cur_phase << ",i=" << i << endl; 
            if (do_search (i)) break ;
        }
    }
    cout << "soluton (" << (int)history_idx << " moves)" << endl;
    for (int k = -1; ++k<history_idx;) {
        cout << "FBRLUD"[history_mov[k]] << history_rpt[k]+1 << ""; 
    }
    cout << endl; 
    return 0; 
} 
