#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
//英语 看博友好分析 抄博友程序 状态压缩dp 没掌握
int da[200];
int st[200];//状态
int sum[200];
int dp[108][80][80];
int cal(int x)
{
int js=0;
while(x)
{
if(x&1)
{
js++;
}
x=x>>1;
}
return js;
}
int main()
{
int n,m;
//cin>>n>>m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=0;j<m;j++)
{
//char c;
//cin>>c;
char ch=getchar();
while(ch!='P' && ch!='H') ch=getchar();
if(ch=='H')//背
{
da[i]|=(1<<j);
}
}
//cout<<da[i]<<endl;
}
int tot=0;
for(int i=0;i<(1<<m);i++)
{
if(!(i&(i<<1))&&!(i&(i<<2)))//1代表p 背
{
st[++tot]=i; sum[tot]=cal(i);
//cout<<i<<" "<<cal(i)<<endl;
}
}
for(int i=1;i<=tot;i++)//抄博友程序
{
if(!(st[i]&da[1]))
{
dp[1][1][i]=sum[i];//背
//cout<<i<<endl;
}
}
for(int i=1;i<n;i++)//背
{
for(int j=1;j<=tot;j++)
{
for(int k=1;k<=tot;k++)
{
if(!(st[j]&st[k])&&dp[i][j][k])//背 j向上二层的状态 k向上一层的状态
{
for(int l=1;l<=tot;l++)
{
if(!(st[l]&st[j]) && !(st[l]&st[k]) && !(st[l]&da[i+1]))//背
{
dp[i+1][k][l]=max(dp[i+1][k][l],dp[i][j][k]+sum[l]);
}
}
}
}
}
}
int jg=0;
for(int i=1;i<=tot;i++)
{
for(int j=1;j<=tot;j++)
{
jg=max(jg,dp[n][i][j]);
}
}
cout<<jg<<endl;
return 0;
}