传送门
//MADE BY Y_is_sunshine;
//#include <bits/stdc++.h>
//#include <memory.h>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define INF 0x3f3f3f3f
#define MAXN 105
const int mod = 1e9 + 7;
const double PI = acos(-1);
using namespace std;
int N, M;
char f[15];
int cnt[105];
int king[105][MAXN];
int state[105][MAXN];
int dp[105][MAXN][MAXN];
void init(int k) {
for (int i = 0; i < M; i++) {
cin >> f[i];
f[i] = f[i] == 'H' ? '0' : '1';
}
f[M] = '\0';
int temp = strtol(f, NULL, 2);
int tot = (1 << M) - 1;
for (int i = 0; i <= tot; i++) {
if ((i | temp) == temp) {
if (!(i & (i << 1) || i & (i << 2) || i & (i >> 1) || i & (i >> 2))) {
state[k][++cnt[k]] = i;
int o = i;
while (o) {
king[k][cnt[k]] += o & 1;
o >>= 1;
}
}
}
}
}
int main(void)
{
freopen("data.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M;
for(int i = 1; i <= N; i++)
init(i);
cnt[0] = 1;
state[0][1] = 0;
for (int i = 1; i <= cnt[1]; i++)
dp[1][i][1] = king[1][i];
for (int i = 2; i <= N; i++) {
for (int o = 1; o <= cnt[i - 2]; o++) {
for (int j = 1; j <= cnt[i - 1]; j++) {
for (int k = 1; k <= cnt[i]; k++) {
if (!(state[i - 2][o] & state[i][k] || state[i - 1][j] & state[i][k])) {
dp[i][k][j] = max(dp[i][k][j], dp[i - 1][j][o] + king[i][k]);
}
}
}
}
}
int ans = 0;
for (int i = 1; i <= cnt[N - 1]; i++) {
for (int j = 1; j <= cnt[N]; j++) {
ans = max(ans, dp[N][j][i]);
}
}
cout << ans << endl;
freopen("CON", "r", stdin);
system("pause");
return 0;
}