#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,cnt=1,tot=0;
int map[105],dp[105][100][100],mark[105],num[105];//map保存图的0101模式//dp第i行在状态j前一行状态为k时 最多...//mark标记是否为可行状态
char s[15];
void init()
{
int i,maxx=(1<<m);
for (i=0;i<maxx;i++)
if ( (!(i&(i<<1))) && (!(i&(i<<2))) )
{
mark[++tot]=i;
int t=i;
while(t) num[tot]+=(t&1),t>>=1;
}
}
bool OK(int a,int b){return !(mark[a]&map[b]);}//如果有1在一块儿,!()返回0
int main()
{
int i,j,ans=-1;
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
init();
gets(s);
for (i=1;i<=n;i++)
{
gets(s);
for (j=1;j<=m;j++)
if (s[j-1]=='H')
map[i]+=(1<<(m-j));
}
for(i=1;i<=tot;i++) if(OK(i,1)) dp[1][i][0]=num[i],ans=max(ans,dp[1][i][0]);//预处理1行
for(i=1;i<=tot;i++)//预处理2行
{
if(!OK(i,2))continue;
for(j=1;j<=tot;j++) if(OK(j,1) && (!(mark[i]&mark[j]))) dp[2][i][j]=max(dp[2][i][j],dp[1][j][0]+num[i]),ans=max(ans,dp[2][i][j]);
}
for(i=3;i<=n;i++)
{
for(int now=1;now<=tot;now++)//枚举本行
{
if(!OK(now,i))continue;
for(int last=1;last<=tot;last++)//枚举上一行
{
if(mark[now]&mark[last])continue;
if(!OK(last,i-1))continue;
for(int llast=1;llast<=tot;llast++)//枚举上上行
{
if( (mark[now]&mark[llast]) || (mark[last]&mark[llast]) )continue;
if(!OK(llast,i-2))continue;
dp[i][now][last]=max(dp[i][now][last],dp[i-1][last][llast]+num[now]);
}
}
}
}
for(int now=1;now<=tot;now++)
for(int last=1;last<=tot;last++)ans=max(ans,dp[n][now][last]);
printf("%d\n",ans);
return 0;
}