rt
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=110,V=1<<10;
int dp[2][V][V],cnt[N];
bool sta[V];
char mp[N][N];
int getsta(int x){
int ret=0;
for(int i=0;i<m;i++)
if(mp[x][i]=='H') ret|=(1<<i);
return ret;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++) scanf(" %c",&mp[i][j]);
fill(sta,sta+(1<<m)+1,true);
for(int S=0;S<(1<<m);S++)
for(int i=0;i<m;i++)
for(int j=0;j<m;j++){
if(!(S&(1<<i))||!(S&(1<<j))||i==j) continue;
if(abs(i-j)<=2) sta[S]=false;
}
for(int S=0;S<(1<<m);S++)
for(int i=0;i<m;i++)
if(!(S&(1<<i))) cnt[S|(1<<i)]=cnt[S]+1;
int op=0;
for(int i=1;i<=n;i++){
int hill=getsta(i);
memset(dp[op^1],0,sizeof dp[op^1]);
for(int S1=0;S1<(1<<m);S1++){
if(!sta[S1]) continue;
for(int S2=0;S2<(1<<m);S2++){
if(!sta[S2]) continue;
if(S1&S2) continue;
for(int S=0;S<(1<<m);S++){
if(!sta[S]) continue;
if((S&S1)||(S&S2)) continue;
if(S&hill) continue;
dp[op^1][S2][S]=max(dp[op^1][S2][S],dp[op][S1][S2]+cnt[S]);
}
}
}
op^=1;
}
int ans=0;
for(int S=0;S<(1<<m);S++)
for(int S1=0;S1<(1<<m);S1++)
if(sta[S]&&sta[S1]) ans=max(ans,dp[op][S][S1]);
cout<<ans;
return 0;
}