#include <bits/stdc++.h>
using namespace std;
const long long MX = 200005;
long long n, m;
vector<long long> adj[2][MX];
long long st[MX], fin[MX];
long long deg[2][MX];
long long ans, tim;
long long cur = 1;
pair<long long, long long> seg[4 * MX];
long long lazy[4 * MX];
pair<long long, long long> merge(pair<long long, long long> x,
                                 pair<long long, long long> y) {
  if (x.first == y.first) return {x.first, x.second + y.second};
  return min(x, y);
}
void build(long long node, long long l, long long r) {
  if (l == r) {
    seg[node] = {0, 1};
    return;
  }
  long long mid = (l + r) / 2;
  build(2 * node, l, mid);
  build(2 * node + 1, mid + 1, r);
  seg[node] = merge(seg[2 * node], seg[2 * node + 1]);
}
void propagate(long long node, long long l, long long r) {
  seg[node].first += lazy[node];
  if (l != r) {
    lazy[2 * node] += lazy[node];
    lazy[2 * node + 1] += lazy[node];
  }
  lazy[node] = 0;
}
void update(long long node, long long l, long long r, long long x, long long y,
            long long val) {
  propagate(node, l, r);
  if (l > y or r < x) return;
  if (l >= x and r <= y) {
    lazy[node] += val;
    propagate(node, l, r);
    return;
  }
  long long mid = (l + r) / 2;
  update(2 * node, l, mid, x, y, val);
  update(2 * node + 1, mid + 1, r, x, y, val);
  seg[node] = merge(seg[2 * node], seg[2 * node + 1]);
}
void dfs(long long u) {
  st[u] = tim++;
  for (auto v : adj[1][u]) {
    dfs(v);
  }
  fin[u] = tim;
}
void solve(long long u) {
  update(1, 0, cur - 1, st[u], fin[u] - 1, 1);
  if (!seg[1].first) ans -= seg[1].second;
  for (auto v : adj[0][u]) {
    solve(v);
  }
  update(1, 0, cur - 1, st[u], fin[u] - 1, -1);
}
signed main() {
  cin >> n >> m;
  vector<vector<long long> > index(n, vector<long long>(m, -1));
  vector<vector<char> > a(n, vector<char>(m));
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      cin >> a[i][j];
      if (a[i][j] == 'L') {
        index[i][j] = cur;
        index[i][j + 1] = cur;
        cur++;
      } else if (a[i][j] == 'U') {
        index[i][j] = cur;
        index[i + 1][j] = cur;
        cur++;
      }
    }
  }
  cur--;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < m; j++) {
      if (a[i][j] == 'L' and j + 2 < m) {
        adj[(i + j) % 2][index[i][j + 2]].push_back(index[i][j]);
        deg[(i + j) % 2][index[i][j]]++;
      }
      if (a[i][j] == 'R' and j - 2 >= 0) {
        adj[(i + j) % 2][index[i][j - 2]].push_back(index[i][j]);
        deg[(i + j) % 2][index[i][j]]++;
      }
      if (a[i][j] == 'U' and i + 2 < n) {
        adj[(i + j) % 2][index[i + 2][j]].push_back(index[i][j]);
        deg[(i + j) % 2][index[i][j]]++;
      }
      if (a[i][j] == 'D' and i - 2 >= 0) {
        adj[(i + j) % 2][index[i - 2][j]].push_back(index[i][j]);
        deg[(i + j) % 2][index[i][j]]++;
      }
    }
  }
  ans = (n * m * n * m) / 4;
  tim = 0;
  for (long long i = 1; i < cur + 1; i++) {
    if (!deg[1][i]) dfs(i);
  }
  build(1, 0, cur - 1);
  for (long long i = 1; i < cur + 1; i++) {
    if (!deg[0][i]) solve(i);
  }
  cout << ans << "\n";
}
