#include #define REP(i, n) for(int i = 0; i < (int) n; ++i) #define FOR(i, j, k) for(int i = (j); i <= (k); ++i) #define FORD(i, j, k) for(int i = (j); i >= (k); --i) using namespace std; typedef long double ld; int w, b; int n; set vars; map vars_map; string vars_arr[321]; bool is_zero(ld x){ return abs(x) < 0.000000001; } ld a[321][321], ans[321]; bool gauss(){ REP(i, n){ if(is_zero(a[i][i])){ FOR(j, i+1, n-1)if(!is_zero(a[j][i])){ FOR(k,i,n) swap(a[i][k],a[j][k]); break; } if(is_zero(a[i][i])) return false; } ld inv = 1.0/a[i][i]; FOR(j, i, n)a[i][j]*=inv; FOR(j, i+1, n-1) FORD(k, n, i){ a[j][k]-=a[i][k]*a[j][i]; } } FORD(i, n-1, 0) REP(j, i){ a[j][n]-=a[i][n]*a[j][i]; FOR(k, 0, i)a[j][k]-=a[i][k]*a[j][i]; } REP(i, n) ans[i]=a[i][n]; return true; } string shorten(string x, char nw){ x.push_back(nw); while(vars.find(x) == vars.end()){ REP(i, (int)x.size() -1){ x[i] = x[i+1]; } x.pop_back(); } return x; } void test(){ n=2; a[0][0] = 1; a[0][1] = 0; a[0][2] = 1; a[1][0] = 1; a[1][1] = 1; a[1][2] = 0.7; assert(gauss()); cerr << ans[0] << " " << ans[1] << endl; } int main(){ cin >> w >> b; string x; REP(i, w){ cin >> x; while(1){ vars.insert(x); if(x.empty()) break; x.pop_back(); } } n=0; for(auto && s : vars){ vars_arr[n] = s; vars_map[s] = n++; } assert(n < 311); REP(i, n+1) REP(j, n+1) a[i][j]=0; REP(i, n){ a[i][i] += 1; if(vars_arr[i].length() == b){ a[i][n]=0; } else{ a[i][n]=1; a[i][vars_map[shorten(vars_arr[i], 'H')]]-=0.5; a[i][vars_map[shorten(vars_arr[i], 'T')]]-=0.5; } } /*REP(i, n){ cout << vars_arr[i] << endl; } REP(i, n){ REP(j, n+1) cout << a[i][j] << " "; cout << endl; }*/ assert(gauss()); //REP(i, n) cout << ans[i] << endl; string empty=""; cout << fixed << setprecision(6) << (ans[vars_map[empty]]) << endl; return 0; }