func_code_string: #include <bits/stdc++.h>   using namespace std;   const int oo = 0x3f3f3f3f;   const int SIZE = 4000050;   const int P = 67;   const int maxn = 20;   int a[maxn], b[maxn];   int F[260];   char str[10];   struct HASH {     int head[SIZE], next[SIZE];     unsigned long long state[SIZE];     double dp[SIZE];     int tol;     void init() {       memset(head, -1, sizeof head);       tol = 0;     }     double find(unsigned long long s) {       for (int i = head[s % SIZE]; i != -1; i = next[i]) {         if (state[i] == s) return dp[i];       }       return -1;     }     bool ins(unsigned long long s, double f) {       if (find(s) > -1) return false;       dp[++tol] = f;       state[tol] = s;       next[tol] = head[s % SIZE];       head[s % SIZE] = tol;       return true;     }   } mat;   unsigned long long Hash(int n) {     for (int i = 1; i <= n; i++) b[i] = a[i];     sort(b + 1, b + n);     unsigned long long s = 0;     for (int i = 1; i <= n; i++) {       s *= P;       s += b[i];     }     return s;   }   inline void set_ST(int st[], int x) {     st[0] = (x >> 4) & 3;     st[1] = (x >> 2) & 3;     st[2] = x & 3;   }   inline int get_ST(int a, int b, int c) {     if (a > c) swap(a, c);     return (((a << 2) + b) << 2) + c;   }   double dfs(int n) {     unsigned long long s = Hash(n);     double f = mat.find(s), c[4] = {0, 1e9, 1e9, 1e9};     if (f > -1) return f;     for (int i = 1; i < n; i++) {       int x[3], y[3], nn = n;       int ai = a[i], an = a[n];       set_ST(x, ai);       set_ST(y, an);       if ((!!x[0]) + (!!x[1]) + (!!x[2]) == 1) continue;       if (y[0] && y[1] && y[2]) {         nn++;         y[0] = y[1] = y[2] = 0;       }       for (int j = 0; j < 3; j++)         if (x[j]) {           if ((!!x[0]) + (!!x[1]) + (!!x[2]) == 2 && (j == 1 || !x[1])) continue;           int t = x[j];           x[j] = 0;           a[i] = get_ST(x[0], x[1], x[2]);           if ((!!x[0]) + (!!x[1]) + (!!x[2]) == 1 || !x[1]) a[i] = 0;           x[j] = t;           for (int k = 0; k < 3; k++)             if (!y[k]) {               y[k] = t;               a[nn] = get_ST(y[0], y[1], y[2]);               y[k] = 0;               c[t] = min(c[t], dfs(nn));             }         }       a[i] = ai;       a[n] = an;     }     if (c[1] == 1e9 && c[2] == 1e9 && c[3] == 1e9) {       mat.ins(s, 0);       return 0.0;     }     double p = 1.0 / 6.0;     if (c[1] == 1e9) p += 1.0 / 3.0, c[1] = 0;     if (c[2] == 1e9) p += 1.0 / 3.0, c[2] = 0;     if (c[3] == 1e9) p += 1.0 / 6.0, c[3] = 0;     f = (c[1] / 3.0 + c[2] / 3.0 + c[3] / 6.0 + 1.0) / (1.0 - p);     mat.ins(s, f);     return f;   }   int main() {     int n;     F[ G ] = 1;     F[ B ] = 2;     F[ R ] = 3;     mat.init();     while (scanf( %d , &n) != EOF) {       for (int i = 1; i <= n; i++) {         scanf( %s , str);         a[i] = get_ST(F[str[0]], F[str[1]], F[str[2]]);       }       printf( %.15lf n , dfs(n));     }   }   