//#define local
#include<cstdio>
#include<iostream>
#include<vector>
#define MAXN 105
#define MAXM 11;
typedef long long ll;
using namespace std;
int n,m;
int e[MAXN];
int dp[2][1<<10][1<<10]={0};
vector<int>p,s;
int count(int k){
int ans=0;
while(k){
if(k&1)
++ans;
k>>=1;
}
return ans;
}
void init(){
for(int i=0;i<1<<m;++i){
if(!(i<<2&i)&&!(i<<1&i)&&!(i>>2&i)&&!(i>>1&i)){
s.push_back(i);
p.push_back(count(i));
}
}
}
int find(int i){
int ans=0;
for(int j=0;j<s.size();++j){
for(int k=0;k<s.size();++k){
if(ans<dp[i%2][j][k])
ans=dp[i%2][j][k];
}
}
return ans;
}
int main(){
#ifdef local
freopen("data.in","rb",stdin);
//freopen("data.out","wb",stdout);
#endif
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=n;++i){
char tmp[11];
scanf("%s",tmp);
int t=0;
for(int j=0;j<m;++j){
if(tmp[j]=='H'){
t=t+(1<<(m-1-j));
}
}
e[i]=t;
}
for(int j=0;j<s.size();++j){
if(!(e[1]&s[j]))
dp[1][j][0]=p[j];
}
if(n==1){
cout<<find(1);
return 0;
}
for(int j=0;j<s.size();++j){
if(!(e[2]&s[j])){
for(int k=0;k<s.size();++k){
if(!(e[1]&s[k])&&!(s[j]&s[k])){
dp[0][j][k]=p[j]+p[k];
}
}
}
}
if(n==2){
cout<<find(2);
return 0;
}
for(int i=3;i<=n;++i){
for(int j=0;j<s.size();++j){
if(!(e[i]&s[j])){
for(int k=0;k<s.size();++k){
if(!(e[i-1]&s[k])&&!(s[k]&s[j])){
for(int w=0;w<s.size();++w){
if(!(e[i-2]&s[w])&&!(s[k]&s[w])&&!(s[j]&s[w])&&(dp[i%2][j][k]<dp[(i-1)%2][k][w]+p[j])){
dp[i%2][j][k]=dp[(i-1)%2][k][w]+p[j];
}
}
}
}
}
}
}
cout<<find(n);
return 0;
}