#include <iostream> // cout, endl, cin
#include <string> // string, to_string, stoi
#include <vector> // vector
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <utility> // pair, make_pair
#include <tuple> // tuple, make_tuple
#include <cstdint> // int64_t, int*_t
#include <cstdio> // printf
#include <map> // map
#include <queue> // queue, priority_queue
#include <set> // set
#include <stack> // stack
#include <deque> // deque
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <bitset> // bitset
#include <cctype> // isupper, islower, isdigit, toupper, tolower
#include <iomanip>//setprecision
#include<math.h>
using namespace std;


void chmax(int& a, int b) {
	if (a < b) {
		a = b;
	}
}
void chmin(int& a, int b) {
	if (a < b) {
		a = b;
	}
}

int main() {

	int H, W;
	cin >> H >> W;
	vector<vector<char>>A(H, vector<char>(H));
	for (int i = 0; i < H; i++) {
		for (int h = 0; h < W; h++) {

			cin >> A[i][h];
		}
	}
	int sum = 0;
	int github = 0;
	for (int i = 1; i < H - 1; i++) {
		for (int h = 1; h < W - 1; h++) {
			if (A[i][h] == '#') {
				if ((A[i][h - 1] == '.') && (A[i - 1][h] == '.')) {
					sum++;
				}
				if ((A[i - 1][h] == '.') && (A[i][h + 1] == '.')) {
					sum++;
				}
				if ((A[i][h - 1] == '.') && (A[i + 1][h] == '.')) {
					sum++;

				}
				if ((A[i][h + 1] == '.') && (A[i + 1][h] == '.')) {
					sum++;
				}
				if ((A[i][h - 1] == '.') && (A[i + 1][h - 1] == '#')) {
					sum++;
					github++;
				}
				if ((A[i][h + 1] == '.') && (A[i + 1][h + 1] == '#')) {
					sum++;
					github++;
				}//
				if ((A[i - 1][h] == '.') && (A[i - 1][h - 1] == '#')) {
					sum++;
					github++;
				}
				if ((A[i + 1][h] == '.') && (A[i + 1][h - 1] == '#')) {
					sum++;
					github++;
				}//
				if ((A[i][h - 1] == '.') && (A[i - 1][h - 1] == '#')) {
					sum++;
					github++;
				}
				if ((A[i][h + 1] == '.') && (A[i - 1][h + 1] == '#')) {
					sum++;
					github++;
				}//
				if ((A[i - 1][h] == '.') && (A[i -1][h + 1] == '#')) {
					sum++;
					github++;
				}
				if ((A[i + 1][h] == '.') && (A[i + 1][h + 1] == '#')) {
					sum++;
					github++;
				}
			}

		}
	}
	int pornhub = github / 2;
	cout << sum - pornhub << endl;
}
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")

using namespace std;
typedef long double ld;
typedef long long int ll;
typedef unsigned long long int ull;
typedef vector<int> vi;
typedef vector<char> vc;
typedef vector<bool> vb;
typedef vector<double> vd;
typedef vector<string> vs;
typedef vector<ll> vll;
typedef vector<pair<int, int> > vpii;
typedef vector<vector<int> > vvi;
typedef vector<vector<char> > vvc;
typedef vector<vector<string> > vvs;
typedef vector<vector<ll> > vvll;
typedef vector<vector<bool> > vvb;

#define rep(i, n) for (int i = 0; i < int(n); ++i)
#define rrep(i, n) for (int i = 1; i <= int(n); ++i)
#define irep(it, stl) for (auto it = stl.begin(); it != stl.end(); it++)
#define drep(i, n) for (int i = int(n)-1; i >= 0; --i)

#define MES(a) MES2 a
#define MES2(a0,a1,a2,a3,a4,x,...) x
#define mes_1(x1) cout<<x1<<endl
#define mes_2(x1,x2) cout<<x1<<" "<<x2<<endl
#define mes_3(x1,x2,x3) cout<<x1<<" "<<x2<<" "<<x3<<endl
#define mes_4(x1,x2,x3,x4) cout<<x1<<" "<<x2<<" "<<x3<<" "<<x4<<endl
#define mes_5(x1,x2,x3,x4,x5) cout<<x1<<" "<<x2<<" "<<x3<<" "<<x4<<" "<<x5<<endl
#define mes(...) CHOOSE((__VA_ARGS__,mes_5,mes_4,mes_3,mes_2,mes_1,~))(__VA_ARGS__)

#define CHOOSE(a) CHOOSE2 a
#define CHOOSE2(a0,a1,a2,a3,a4,x,...) x
#define debug_1(x1) cout<<#x1<<": "<<x1<<endl
#define debug_2(x1,x2) cout<<#x1<<": "<<x1<<", "#x2<<": "<<x2<<endl
#define debug_3(x1,x2,x3) cout<<#x1<<": "<<x1<<", "#x2<<": "<<x2<<", "#x3<<": "<<x3<<endl
#define debug_4(x1,x2,x3,x4) cout<<#x1<<": "<<x1<<", "#x2<<": "<<x2<<", "#x3<<": "<<x3<<", "#x4<<": "<<x4<<endl
#define debug_5(x1,x2,x3,x4,x5) cout<<#x1<<": "<<x1<<", "#x2<<": "<<x2<<", "#x3<<": "<<x3<<", "#x4<<": "<<x4<<", "#x5<<": "<<x5<<endl
#define debug(...) CHOOSE((__VA_ARGS__,debug_5,debug_4,debug_3,debug_2,debug_1,~))(__VA_ARGS__)

#define ynmes(a) (a) ? mes("Yes") : mes("No")
#define YNmes(a) (a) ? mes("YES") : mes("NO")
#define re0 return 0
#define mp(p, q) make_pair(p, q)
#define pb(n) push_back(n)
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define Sort(a) sort(a.begin(), a.end())
#define rSort(a) sort(a.rbegin(), a.rend())
#define Rev(a) reverse(a.begin(), a.end())
#define MATHPI acos(-1)
#define itn int;
int dx[8] = { 1, 0, -1, 0, 1, -1, -1, 1 };
int dy[8] = { 0, 1, 0, -1, 1, 1, -1, -1 };
template <class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template <class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
struct io { io() { ios::sync_with_stdio(false); cin.tie(0); } };
const int INF = INT_MAX;
const ll LLINF = 1LL << 60;
const ll MOD = 1000000007;
const double EPS = 1e-9;

ll fact_mod(ll n, ll mod) {
    ll f = 1; for (ll i = 2; i <= n; i++) f = f * (i % mod) % mod;
    return f;
}

ll modpow(ll x, ll n, ll mod) {
    if(n == 0) return 1;
    ll res = modpow((x * x) % mod, n / 2 , mod);
    if(n & 1) res = (res * x) % mod;
    return res;
}

ll modncr(ll n, ll r, ll mod) {
    if(r > n-r) r = n-r;
    if(r == 0) return 1;
    ll a = 1;
    rep(i, r) a = a * ((n-i) % mod) % mod;
    ll b = modpow(fact_mod(r, mod), mod-2, mod);
    return (a % mod) * (b % mod) % mod;
}


signed main() {
	ll h, w;
	cin >> h >> w;
	vs field(h);
	rep(i, h) {
		cin >> field[i];
	}
	ll cnt = 0, r = 0;
	rep(i, h-1) {
		rep(j, w-1) {
			cnt = 0;
			if (field[i][j] == '#') cnt++;
			if (field[i][j+1] == '#') cnt++;
			if (field[i+1][j] == '#') cnt++;
			if (field[i+1][j+1] == '#') cnt++;
			if (cnt % 2 == 1) r++;
		}
		
	}
	
	
	mes(r);
	
	
	
	
	
}
