#include<iostream>
#include<cstring>
using namespace std;
const int N = 109,M = 10,K = 109;
int n,m;
char c[N][M];
int valid_stat[K],count[K],cnt;
int valid[N][K];
int dp[N][K][K];
int lowbit(int x){
return x & (-x);
}
int popcount(int x){
int ret = 0;
for(;x;x -= lowbit(x))
ret++;
return ret;
}
bool check(int x){
while(lowbit(x) < x){
int lb = lowbit(x);
x -= lb;
if(lowbit(x) / lb < 8)
return false;
}
return true;
}
bool check2(int row,int x){
for(int k = 0;k < m;k++)
if(((x >> k) & 1) && c[row][k] == 'H')
return false;
return true;
}
int main(){
cin >> n >> m;
for(int i = 1;i <= n;i++)
cin >> c[i];
int tot = 1 << m;
for(int i = 0;i < tot;i++)
if(check(i)){
cnt++;
valid_stat[cnt] = i;
count[cnt] = popcount(i);
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= cnt;j++){
int stat = valid_stat[j];
valid[i][j] = check2(i,stat);
}
}
memset(dp,128,sizeof dp);
dp[0][1][1] = 0;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= cnt;j++){
int stat1 = valid_stat[j];
if(!valid[i][j])
continue;
for(int k = 1;k <= cnt;k++){
int stat2 = valid_stat[k];
if(!valid[i - 1][k])
continue;
if(stat1 & stat2)
continue;
int Max = 0;
for(int l = 1;l <= cnt;l++){
int stat3 = valid_stat[l];
if(stat1 & stat3)
continue;
Max = max(Max,dp[i - 1][k][l]);
}
dp[i][j][k] = Max + count[j];
}
}
}
int ans = 0;
for(int j = 1;j <= cnt;j++){
int stat1 = valid_stat[j];
if(!valid[n][j])
continue;
for(int k = 1;k <= cnt;k++){
int stat2 = valid_stat[k];
if(!valid[n - 1][k])
continue;
if(stat1 & stat2)
continue;
ans = max(ans,dp[n][j][k]);
}
}
cout << ans;
return 0;
}