#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int dp[108][1 << 10][1 << 10];
int ma[108][18];
int n, m;
vector<int> sta[108], pao[108];
int st[18];
void dfs(int r, int p)
{
if (p == m + 1)
{
int s = 0, t = 0;
bool fl = false;
for (int i = 1; i <= m; i++)
{
s <<= 1;
if (st[i]) s |= 1, t++;
}
for (int j = 1; j <= 2; j++)
if ((s << j) & s || (s & (s >> j)))
{
fl = true;
break;
}
if (!fl)
{
sta[r].push_back(s);
pao[r].push_back(t);
}
return;
}
dfs(r, p + 1);
if (ma[r][p])
{
st[p] = 1;
dfs(r, p + 1);
st[p] = 0;
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
char c; cin >> c;
if (c == 'P') ma[i][j] = 1;
}
sta[0].push_back(0), pao[0].push_back(0);
for (int i = 1; i <= n; i++) dfs(i, 1);
for (int i = 0; i < pao[1].size(); i++) dp[1][0][i] = pao[1][i];
for (int i = 0; i < pao[1].size(); i++)
for (int j = 0; j < pao[2].size(); j++)
{
if (sta[1][i] & sta[2][j]) continue;
dp[2][i][j] = max(dp[2][i][j], dp[1][0][i] + pao[2][j]);
}
for (int i = 3; i <= n; i++)
{
for (int j = 0; j < sta[i - 2].size(); j++)
{
for (int k = 0; k < sta[i - 1].size(); k++)
{
if (sta[i - 2][j] & sta[i - 1][k]) continue;
for (int l = 0; l < sta[i].size(); l++)
{
if (sta[i][l] & sta[i - 1][k]) continue;
if (sta[i][l] & sta[i - 2][j]) continue;
dp[i][k][l] = max(dp[i][k][l], dp[i - 1][j][k] + pao[i][l]);
}
}
}
}
int ans = 0;
for(int j = 0; j < sta[n - 1].size(); j++)
for (int i = 0; i < sta[n].size(); i++)
ans = max(ans, dp[n][j][i]);
printf("%d", ans);
return 0;
}