#include <bits/stdc++.h>
using namespace std;
int cnt, dfn[800005], ed[800005], tot, head[800005], tr[800005 * 4],
    sum[800005 * 4], fuckljx, n, m, vis[800005], de[800005];
char c[800005];
vector<char> mp[800005];
struct edge {
  int to, next;
} data[800005 * 2];
struct hh {
  long long x, a, b, val;
} edge[800005 * 2];
bool operator<(hh A, hh B) { return A.x < B.x; }
void add_edge(int x, int y) {
  if (!x || !y) return;
  de[y]++;
  data[++tot].next = head[x];
  data[tot].to = y;
  head[x] = tot;
}
int id(int x, int y) {
  if (x < 1 || x > n || y < 1 || y > m) return 0;
  return (x - 1) * m + y;
}
void dfs(int x, int f) {
  vis[x] = 1;
  dfn[x] = ++cnt;
  for (int i = head[x]; i; i = data[i].next) {
    int t = data[i].to;
    if (t == f) continue;
    dfs(t, x);
  }
  ed[x] = cnt;
}
void add(int x, int l, int r, int s, int t, int val) {
  if (l > t || r < s) return;
  if (s <= l && r <= t) {
    if (val == 1) {
      sum[x]++;
      tr[x] = (r - l + 1);
    } else {
      sum[x]--;
      if (!sum[x]) tr[x] = tr[x * 2] + tr[x * 2 + 1];
    }
    return;
  }
  int mid = (l + r) / 2;
  add(x * 2, l, mid, s, t, val);
  add(x * 2 + 1, mid + 1, r, s, t, val);
  if (!sum[x])
    tr[x] = tr[x * 2] + tr[x * 2 + 1];
  else
    tr[x] = (r - l + 1);
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    scanf("%s", c + 1);
    for (int j = 1; j <= m; j++) {
      if (c[j] == 'U') add_edge(id(i - 1, j), id(i + 1, j));
      if (c[j] == 'D') add_edge(id(i + 1, j), id(i - 1, j));
      if (c[j] == 'L') add_edge(id(i, j - 1), id(i, j + 1));
      if (c[j] == 'R') add_edge(id(i, j + 1), id(i, j - 1));
      mp[i].push_back(c[j]);
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (((i + j) & 1) && !de[id(i, j)]) dfs(id(i, j), 0);
    }
  }
  cnt = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (!((i + j) & 1) && !de[id(i, j)]) dfs(id(i, j), 0);
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (mp[i][j - 1] == 'U') {
        if ((i + j) & 1) {
          edge[++fuckljx] =
              (hh){dfn[id(i, j)], dfn[(id(i + 1, j))], ed[(id(i + 1, j))], 1};
          edge[++fuckljx] = (hh){ed[id(i, j)] + 1, dfn[(id(i + 1, j))],
                                 ed[(id(i + 1, j))], -1};
        } else {
          edge[++fuckljx] =
              (hh){dfn[id(i + 1, j)], dfn[(id(i, j))], ed[(id(i, j))], 1};
          edge[++fuckljx] =
              (hh){ed[id(i + 1, j)] + 1, dfn[(id(i, j))], ed[(id(i, j))], -1};
        }
      }
      if (mp[i][j - 1] == 'L') {
        if ((i + j) & 1) {
          edge[++fuckljx] =
              (hh){dfn[id(i, j)], dfn[(id(i, j + 1))], ed[(id(i, j + 1))], 1};
          edge[++fuckljx] = (hh){ed[id(i, j)] + 1, dfn[(id(i, j + 1))],
                                 ed[(id(i, j + 1))], -1};
        } else {
          edge[++fuckljx] =
              (hh){dfn[id(i, j + 1)], dfn[(id(i, j))], ed[(id(i, j))], 1};
          edge[++fuckljx] =
              (hh){ed[id(i, j + 1)] + 1, dfn[(id(i, j))], ed[(id(i, j))], -1};
        }
      }
    }
  }
  sort(edge + 1, edge + 1 + fuckljx);
  long long last = 0, ans = 0;
  for (int i = 1; i <= fuckljx; i++) {
    ans += (long long)tr[1] * (edge[i].x - last);
    last = edge[i].x;
    add(1, 1, cnt + 3, edge[i].a, edge[i].b, edge[i].val);
  }
  cout << ans;
}
