#include <iostream>
#include <climits>
using namespace std;
const int kMaxN=101;
const int kMaxM=11;
int dp[kMaxN][1<<10][1<<10];
int n,m;
int mp[kMaxN][kMaxM],ans;
int zk[kMaxN];
int cnt;
struct CAN
{
int zt,num;
}can[1<<10];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
zk[i]=0;
for(int j=1;j<=m;j++)
{
char a;
cin>>a;
mp[i][j]=(a=='P'?1:0);
zk[i]=(zk[i]<<1)+mp[i][j];
}
}
for(int i=1;i<=(1<<m)-1;i++)
{
if(i&(i<<1))continue;
if(i&(i<<2))continue;
if(i&(i>>1))continue;
if(i&(1>>2))continue;
can[++cnt].zt=i;
int z=i;
while(z)
{
if(z&1)
{
can[cnt].num++;
}
z>>=1;
}
}
for(int i=1;i<=cnt;i++)
{
if((can[i].zt&zk[1])!=can[i].zt)continue;
dp[1][i][0]=can[cnt].num;
}
for(int i=1;i<=cnt;i++)
{
if((can[i].zt&zk[1])!=can[i].zt)continue;
for(int j=1;j<=cnt;j++)
{
if((can[j].zt&zk[2])!=can[j].zt)continue;
if((can[i].zt&can[j].zt))continue;
dp[2][j][i]=can[i].num+can[j].num;
}
}
for(int i=3;i<=n;i++)
{
for(int j=1;j<=cnt;j++)
{
if((can[j].zt&zk[i-2])!=can[j].zt)continue;
for(int k=1;k<=cnt;k++)
{
if((can[k].zt&zk[i-1])!=can[k].zt)continue;
if((can[j].zt&can[k].zt))continue;
for(int l=1;l<=cnt;l++)
{
if((can[l].zt&can[i].zt))continue;
if((can[l].zt&can[j].zt))continue;
if((can[l].zt&zk[i])!=can[l].zt)continue;;
dp[i][l][k]=max(dp[i][l][k],dp[i-1][k][j]+can[l].num);
ans=max(ans,dp[i][l][k]);
}
}
}
}
cout<<ans;
return 0;
}