#include using namespace std; const int N = 307; int _n, l; bool acc[N]; int cnt; int p[N]; int T[N][2]; string in[N]; int n; long double dp[N][N]; char s[100]; void add(int a){ int cur = 0; scanf("%s", s + 1); for(int i = 1; i <= l; ++i){ bool t = s[i] == 'T'; if(T[cur][t] == -1){ T[cur][t] = ++cnt; in[cnt] = in[cur]; in[cnt].push_back(t + '0'); } cur = T[cur][t]; } acc[cur] = true; } int Find(string a){ int cur = 0, licz = 0; for(char c: a){ cur = T[cur][c - '0']; ++licz; if(cur < 0 || (int)in[cur].size() < licz) return -1; } return cur; } int check(int a, int b){ string t = in[a]; t.push_back(b + '0'); while(t.size()){ int id = Find(t); if(id != -1) return id; reverse(t.begin(), t.end()); t.pop_back(); reverse(t.begin(), t.end()); } return 0; } long double res[N]; void solveGauss(){ for(int i = 0; i <= n; ++i){ for(int j = i + 1; j <= n; ++j){ if(dp[j][i] == 0.0) continue; double t = dp[j][i] / dp[i][i]; for(int k = 0; k <= n + 1; ++k) dp[j][k] -= t * dp[i][k]; } } res[n] = dp[n][n + 1] / dp[n][n]; for(int i = n - 1; i >= 0; --i){ res[i] = dp[i][n + 1]; for(int j = n; j > i; --j) res[i] -= res[j] * dp[i][j]; res[i] /= dp[i][i]; } } int main(){ scanf("%d %d", &_n, &l); for(int i = 0; i <= _n * l; ++i) T[i][0] = T[i][1] = -1; for(int i = 1; i <= _n; ++i) add(i); for(int i = 0; i <= cnt; ++i){ if(acc[i]) continue; if(T[i][0] == -1) T[i][0] = check(i, 0); if(T[i][1] == -1) T[i][1] = check(i, 1); // printf("%d :: %d %d\n", i, T[i][0], T[i][1]); } n = cnt; for(int i = 0; i <= cnt; ++i) if(acc[i]) dp[i][i] = 1; else{ dp[i][i] = 1; dp[i][T[i][0]] -= 0.5; dp[i][T[i][1]] -= 0.5; dp[i][cnt + 1] = 1; } // for(int i = 0; i <= cnt; ++i){ // for(int j = 0; j <= cnt + 1; ++j) // printf("%Lf ", dp[i][j]); // puts(""); // } solveGauss(); printf("%.9Lf\n", res[0]); return 0; }