#include <bits/stdc++.h>
#define int long long
#define mp make_pair
#define ls (rt<<1)
#define rs (rt<<1|1)
using namespace std;
const int N=6e5+10;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w*=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
int n,m,cnt,tot,num,yl,yr,ans,io;
int yy[4*N],length[4*N],cover[4*N];
int vis[N],in[N],id[N],siz[N],dfn[N];
char s[N];
vector<char> mtx[N];
vector<pair<int,int> > P[N];
vector<int> ver[N];
struct ScanLine{
int x; //x坐标
int uy,dy; //上边的y坐标与下边的y坐标
int flag; //出入边
ScanLine(){}
ScanLine(int xx,int yy,int yyy,int c):x(xx),uy(yy),dy(yyy),flag(c){}
}line[N];
inline int HASH(int x,int y) { return (x-1)*m+y; }
inline bool cmp(ScanLine &a,ScanLine &b) { return a.x<b.x; }
inline void Add(int x,int y)
{
ver[x].push_back(y);
in[y]=1;
}
inline void DFS(int u)
{
siz[u]=1,dfn[u]=++tot;
for(register int i=0;i<ver[u].size();i++)
DFS(ver[u][i]),siz[u]+=siz[ver[u][i]];
}
inline void pushup(int l,int r,int rt)
{
if(cover[rt]) length[rt]=yy[r]-yy[l];
else if(l+1==r) length[rt]=0;
else length[rt]=length[ls]+length[rs];
}
inline void update(int yl,int yr,int io,int l,int r,int rt)
{
if(yl>r||yr<l) return ;
if(yl<=l&&yr>=r){
cover[rt] += io,pushup(l,r,rt);
return ;
}
if(l+1==r)return ;
int m=(l+r)>>1;
if(yl<=m) update(yl,yr,io,l,m,ls);
if(yr>m) update(yl,yr,io,m,r,rs);
pushup(l,r,rt);
}
signed main()
{
n=read(),m=read();
for(register int i=0;i<=n+1;i++) mtx[i].resize(m+1);
for(register int i=1;i<=n;i++){
scanf("%s",s+1);
for(register int j=1;j<=m;j++) mtx[i][j]=s[j];
}
for(register int i=1;i<=n;i++){
for(register int j=1;j<=m;j++){
if(i+2<=n&&mtx[i+1][j]=='U'&&mtx[i+2][j]=='D') Add(HASH(i,j),HASH(i+2,j));
if(i-2>=1&&mtx[i-1][j]=='D'&&mtx[i-2][j]=='U') Add(HASH(i,j),HASH(i-2,j));
if(j+2<=m&&mtx[i][j+1]=='L'&&mtx[i][j+2]=='R') Add(HASH(i,j),HASH(i,j+2));
if(j-2>=1&&mtx[i][j-1]=='R'&&mtx[i][j-2]=='L') Add(HASH(i,j),HASH(i,j-2));
if(!id[HASH(i,j)]){ //记录骨牌编号
id[HASH(i,j)]=++cnt;
if(mtx[i][j]=='L') id[HASH(i,j+1)]=cnt;
if(mtx[i][j]=='U') id[HASH(i+1,j)]=cnt;
}
P[id[HASH(i,j)]].push_back(mp(i,j));
}
}
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++)
if(!in[HASH(i,j)]) DFS(HASH(i,j));
for(register int i=1;i<=cnt;i++){
int a=P[i][0].first,b=P[i][0].second,c=P[i][1].first,d=P[i][1].second;
int u=HASH(a,b),v=(HASH(c,d));
int L1L=dfn[u],R1R=dfn[u]+siz[u]-1;
int L2L=dfn[v],R2R=dfn[v]+siz[v]-1;
if((a+b)&1) swap(L1L,L2L),swap(R1R,R2R); //严格分成两种颜色
//cout<<L1L<<" "<<L2L<<" "<<R1R+1<<" "<<R2R+1<<endl;
line[++num]=ScanLine(L1L,R2R+1,L2L,1);
yy[num]=L2L;
line[++num]=ScanLine(R1R+1,R2R+1,L2L,-1);
yy[num]=R2R+1;
}
sort(yy+1,yy+num+1);
sort(line+1,line+num+1,cmp);
memset(cover,0,sizeof(cover));
memset(length,0,sizeof(length));
int len=unique(yy+1,yy+num+1)-(yy+1);
for(register int i=1;i<=num;i++){
ans+=length[1]*(line[i].x-line[i-1].x);
//cout<<length[1]<<" "<<ans<<endl;
yl=lower_bound(yy+1,yy+len+1,line[i].dy)-yy;
yr=lower_bound(yy+1,yy+len+1,line[i].uy)-yy;
io=line[i].flag;
//cout<<yl<<" "<<yr<<" "<<io<<endl;
update(yl,yr,io,1,len,1);
}
printf("%lld\n",ans);
return 0;
}