← Home
#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;
}