#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:64000000")
using namespace std;
const int MAXN = 500005;
int l, n, m;
char c[MAXN];
int d[MAXN];
int curx, cury;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
long long t[4][MAXN];
bool b[4][MAXN];
int mx[4];
long long cnt;
long long ans;
bool used1[101][101], used2[101][101];
int func(int h, long long tt) {
  int l = 1, r = max(m, n), ans = 0;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (t[h][mid] < tt) {
      ans = mid;
      l = mid + 1;
    } else {
      r = mid - 1;
    }
  }
  return ans;
}
void solve() {
  scanf("%d%d%d%s", &l, &n, &m, &c[1]);
  for (int i = 1; i <= l; i++) {
    if (c[i] == 'U') {
      d[i] = 0;
    } else if (c[i] == 'R') {
      d[i] = 1;
    } else if (c[i] == 'D') {
      d[i] = 2;
    } else if (c[i] == 'L') {
      d[i] = 3;
    }
  }
  memset(t, 127, sizeof(t));
  for (int i = 1; i <= l; i++) {
    curx += dx[d[i]];
    cury += dy[d[i]];
    if (curx > 0) {
      t[2][curx] = min(t[2][curx], (long long)i);
      b[2][curx] = true;
      mx[2] = max(mx[2], curx);
    }
    if (curx < 0) {
      t[0][-curx] = min(t[0][-curx], (long long)i);
      b[0][-curx] = true;
      mx[0] = max(mx[0], -curx);
    }
    if (cury > 0) {
      t[1][cury] = min(t[1][cury], (long long)i);
      b[1][cury] = true;
      mx[1] = max(mx[1], cury);
    }
    if (cury < 0) {
      t[3][-cury] = min(t[3][-cury], (long long)i);
      b[3][-cury] = true;
      mx[3] = max(mx[3], -cury);
    }
  }
  if (mx[0] + mx[2] + 1 <= n && mx[1] + mx[3] + 1 <= m && curx == 0 &&
      cury == 0) {
    printf("-1\n");
    return;
  }
  if (curx < 0) {
    for (int i = 1; i <= max(n, m); i++) {
      if (!b[0][i]) {
        t[0][i] = t[0][i + curx] + l;
      }
    }
  }
  if (cury > 0) {
    for (int i = 1; i <= max(n, m); i++) {
      if (!b[1][i]) {
        t[1][i] = t[1][i - cury] + l;
      }
    }
  }
  if (curx > 0) {
    for (int i = 1; i <= max(n, m); i++) {
      if (!b[2][i]) {
        t[2][i] = t[2][i - curx] + l;
      }
    }
  }
  if (cury < 0) {
    for (int i = 1; i <= max(n, m); i++) {
      if (!b[3][i]) {
        t[3][i] = t[3][i + cury] + l;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    long long tt = min(t[0][i], t[2][n - i + 1]);
    int l = min(func(3, tt), m);
    int r = min(func(1, tt), m);
    if (l + r < m) {
      cnt += m - l - r;
      ans += tt % 1000000007 * (m - l - r) % 1000000007;
      ans %= 1000000007;
    }
  }
  for (int i = 1; i <= m; i++) {
    long long tt = min(t[1][i], t[3][m - i + 1]);
    int l = min(func(0, tt), n);
    int r = min(func(2, tt), n);
    if (l + r < n) {
      cnt += n - l - r;
      ans += tt % 1000000007 * (n - l - r) % 1000000007;
      ans %= 1000000007;
    }
  }
  cout << ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  srand(1337);
  solve();
  return 0;
}
