#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1000010;
const long long mod = 1e9 + 7;
struct rec {
  long long Max, Min;
} x[MAXN], y[MAXN];
struct POINT {
  long long x, y;
} k;
long long num = 0, NUM, NUM2, T;
long long con[MAXN * 2], ans;
long long dx[MAXN], dy[MAXN];
long long n, h, w;
long long BOL = 0;
void init() {
  long long xx = 0, yy = 0;
  num = 1;
  x[1].Max = x[1].Min = 0;
  y[1].Max = y[1].Min = 0;
  con[1] = 1;
  for (long long i = 1; i <= n; i++) {
    xx += dx[i];
    yy += dy[i];
    if ((xx <= x[num].Max && xx >= x[num].Min) &&
        (yy <= y[num].Max && yy >= y[num].Min)) {
      con[num]++;
    } else {
      x[num + 1].Max = max(x[num].Max, xx);
      x[num + 1].Min = min(x[num].Min, xx);
      y[num + 1].Max = max(y[num].Max, yy);
      y[num + 1].Min = min(y[num].Min, yy);
      con[num + 1] = 1;
      num++;
    }
    if ((x[num].Max - x[num].Min + 1 > h) ||
        (y[num].Max - y[num].Min + 1 > w)) {
      num--;
      return;
    }
  }
  k.x = xx;
  k.y = yy;
  NUM = num;
  if (xx == 0 && yy == 0) {
    BOL = 1;
    return;
  }
  for (long long i = 1; i <= n; i++) {
    xx += dx[i];
    yy += dy[i];
    if ((xx <= x[num].Max && xx >= x[num].Min) &&
        (yy <= y[num].Max && yy >= y[num].Min)) {
      con[num]++;
    } else {
      x[num + 1].Max = max(x[num].Max, xx);
      x[num + 1].Min = min(x[num].Min, xx);
      y[num + 1].Max = max(y[num].Max, yy);
      y[num + 1].Min = min(y[num].Min, yy);
      con[num + 1] = 1;
      num++;
    }
    if ((x[num].Max - x[num].Min + 1 > h) ||
        (y[num].Max - y[num].Min + 1 > w)) {
      num--;
      return;
    }
  }
  T = num - NUM;
  for (long long i = 1; i <= n; i++) {
    xx += dx[i];
    yy += dy[i];
    if ((xx <= x[num].Max && xx >= x[num].Min) &&
        (yy <= y[num].Max && yy >= y[num].Min)) {
      con[num]++;
    } else {
      break;
    }
    if ((x[num].Max - x[num].Min + 1 > h) ||
        (y[num].Max - y[num].Min + 1 > w)) {
      return;
    }
  }
  for (long long i = 1; i <= h + w + 1; i++) {
    num++;
    x[num].Max = max(x[num - T].Max, x[num - T].Max + k.x);
    x[num].Min = min(x[num - T].Min, x[num - T].Min + k.x);
    y[num].Max = max(y[num - T].Max, y[num - T].Max + k.y);
    y[num].Min = min(y[num - T].Min, y[num - T].Min + k.y);
    con[num] = con[num - T];
    if ((x[num].Max - x[num].Min + 1 > h) ||
        (y[num].Max - y[num].Min + 1 > w)) {
      num--;
      return;
    }
  }
}
signed main() {
  char c;
  memset(dx, 0, sizeof(dx));
  memset(dy, 0, sizeof(dy));
  scanf("%lld%lld%lld\n", &n, &h, &w);
  for (long long i = 1; i <= n; i++) {
    scanf("%c", &c);
    if (c == 'R') dy[i]++;
    if (c == 'L') dy[i]--;
    if (c == 'D') dx[i]++;
    if (c == 'U') dx[i]--;
  }
  init();
  if (BOL) {
    printf("-1\n");
    return 0;
  }
  for (long long i = 1; i <= num; i++) {
    ans = (ans + (h - (x[i].Max - x[i].Min)) * (w - (y[i].Max - y[i].Min)) %
                     mod * con[i] % mod) %
          mod;
  }
  printf("%lld\n", ans);
  return 0;
}
