#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxm = 10 + 5;
const int maxn = 100 + 10;
char g[maxn][maxm];
int m, n, dex;
int state[70];
int soldier_num[70];
int hill[maxn];
int d[maxn][70][70];
#define conflict(a, b) a&b
int main() {
memset(state, 0, sizeof(state));
memset(soldier_num, 0, sizeof(soldier_num));
memset(d, 0, sizeof(d));
memset(hill, 0, sizeof(hill));
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) {
scanf("%s", g[i]);
for(int j = 0; j < m; j++)
if(g[i][j] == 'H') hill[i] += (1 << j);
}
dex = 0;
for(int i = 0; i < (1 << m); i++) {
if(conflict(i, i << 1) || conflict(i, i << 2)) continue;
int tmp = i;
while(tmp) {
soldier_num[dex] += tmp & 1;
tmp = tmp >> 1;
}
state[dex++] = i;
}
for(int i = 0; i < dex; i++) {
if(conflict(hill[0], state[i])) continue;
d[0][i][0] = soldier_num[i];
}
for(int i = 0; i < dex; i++) {
if(conflict(hill[1], state[i])) continue;
for(int j = 0; j < dex; j++) {
if(conflict(hill[0], state[j])) continue;
if(conflict(state[i], state[j])) continue;
d[1][i][j] = max(d[1][i][j], d[0][j][0] + soldier_num[i]);
}
}
for(int r = 2; r < n; r++) {
for(int i = 0; i < dex; i++) {
if(conflict(state[i], hill[r])) continue;
for(int j = 0; j < dex; j++) {
if(conflict(state[j], hill[r-1])) continue;
if(conflict(state[j], state[i])) continue;
for(int k = 0; k < dex; k++) {
if(conflict(state[k], hill[r-2])) continue;
if(conflict(state[k], state[i])) continue;
if(conflict(state[k], state[j])) continue;
d[r][i][j] = max(d[r][i][j], d[r-1][j][k] + soldier_num[i]);
}
}
}
}
int ans = 0;
for(int i = 0; i < dex; i++) {
for(int j = 0; j < dex; j++) {
ans = max(ans, d[n-1][i][j]);
}
}
printf("%d\n", ans);
return 0;
}