#include <bits/stdc++.h>
using namespace std;
string path;
// (x - 1, y)
// (x, y - 1) (x, y) (x, y + 1)
// (x + 1, y)
int ans;
bool visited[8][8];
bool ok(int x, int y) {
return (1 <= x && x <= 7 && 1 <= y && y <= 7 && !visited[x][y]);
}
void backtrack(int i, int x, int y) {
// tới ô đích nhưng chưa đi đủ 48 bước
if (i < 48 && x == 7 && y == 1) return;
// đã đi đủ 48 bước
if (i == 48) {
if (x == 7 && y == 1) ans++;
return;
}
bool ok_left = ok(x, y - 1);
bool ok_right = ok(x, y + 1);
bool ok_up = ok(x - 1, y);
bool ok_down = ok(x + 1, y);
// bị chặn trái và phải nhưng có thể đi lên xuống
if (!ok_left && !ok_right && ok_up && ok_down) return;
// bị chặn trên dưới nhưng có thể đi trái phải
if (!ok_up && !ok_down && ok_left && ok_right) return;
visited[x][y] = true;
// qua trái
if (path[i] == 'L' || path[i] == '?') {
if (ok_left) backtrack(i + 1, x, y - 1);
}
// qua phải
if (path[i] == 'R' || path[i] == '?') {
if (ok_right) backtrack(i + 1, x, y + 1);
}
// xuống dưới
if (path[i] == 'D' || path[i] == '?') {
if (ok_down) backtrack(i + 1, x + 1, y);
}
// lên trên
if (path[i] == 'U' || path[i] == '?') {
if (ok_up) backtrack(i + 1, x - 1, y);
}
// bước quay lui
visited[x][y] = false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> path;
ans = 0;
backtrack(0, 1, 1);
cout << ans << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKIApzdHJpbmcgcGF0aDsgIAovLyAgICAgICAgICAgCSAgICAoeCAtIDEsIHkpCi8vICAgKHgsIHkgLSAxKSAgICAgICh4LCB5KSAgICAgICAgKHgsIHkgKyAxKQovLyAgICAgICAgICAgCSAgICAoeCArIDEsIHkpCiAKaW50IGFuczsgIApib29sIHZpc2l0ZWRbOF1bOF07ICAKIApib29sIG9rKGludCB4LCBpbnQgeSkgewoJcmV0dXJuICgxIDw9IHggJiYgeCA8PSA3ICYmIDEgPD0geSAmJiB5IDw9IDcgJiYgIXZpc2l0ZWRbeF1beV0pOyAKfQogCnZvaWQgYmFja3RyYWNrKGludCBpLCBpbnQgeCwgaW50IHkpIHsKCS8vIHThu5tpIMO0IMSRw61jaCBuaMawbmcgY2jGsGEgxJFpIMSR4bunIDQ4IGLGsOG7m2MKCWlmIChpIDwgNDggJiYgeCA9PSA3ICYmIHkgPT0gMSkgcmV0dXJuOwogCQogCS8vIMSRw6MgxJFpIMSR4bunIDQ4IGLGsOG7m2MKCWlmIChpID09IDQ4KSB7CgkJaWYgKHggPT0gNyAmJiB5ID09IDEpIGFucysrOyAKCQlyZXR1cm47IAoJfQogIAoJYm9vbCBva19sZWZ0ID0gb2soeCwgeSAtIDEpOyAKCWJvb2wgb2tfcmlnaHQgPSBvayh4LCB5ICsgMSk7IAoJYm9vbCBva191cCA9IG9rKHggLSAxLCB5KTsgCglib29sIG9rX2Rvd24gPSBvayh4ICsgMSwgeSk7IAogCQogCS8vIGLhu4sgY2jhurduIHRyw6FpIHbDoCBwaOG6o2kgbmjGsG5nIGPDsyB0aOG7gyDEkWkgbMOqbiB4deG7kW5nCglpZiAoIW9rX2xlZnQgJiYgIW9rX3JpZ2h0ICYmIG9rX3VwICYmIG9rX2Rvd24pIHJldHVybjsgCgkvLyBi4buLIGNo4bq3biB0csOqbiBkxrDhu5tpIG5oxrBuZyBjw7MgdGjhu4MgxJFpIHRyw6FpIHBo4bqjaQogCWlmICghb2tfdXAgJiYgIW9rX2Rvd24gJiYgb2tfbGVmdCAmJiBva19yaWdodCkgcmV0dXJuOyAgCgoJdmlzaXRlZFt4XVt5XSA9IHRydWU7ICAgCiAJCiAJLy8gcXVhIHRyw6FpCglpZiAocGF0aFtpXSA9PSAnTCcgfHwgcGF0aFtpXSA9PSAnPycpIHsKCQlpZiAob2tfbGVmdCkgYmFja3RyYWNrKGkgKyAxLCB4LCB5IC0gMSk7IAoJfQoJCgkvLyBxdWEgcGjhuqNpCglpZiAocGF0aFtpXSA9PSAnUicgfHwgcGF0aFtpXSA9PSAnPycpIHsKCQlpZiAob2tfcmlnaHQpIGJhY2t0cmFjayhpICsgMSwgeCwgeSArIDEpOyAgCgl9CgoJLy8geHXhu5FuZyBkxrDhu5tpCglpZiAocGF0aFtpXSA9PSAnRCcgfHwgcGF0aFtpXSA9PSAnPycpIHsKCQlpZiAob2tfZG93bikgYmFja3RyYWNrKGkgKyAxLCB4ICsgMSwgeSk7ICAKCX0KCgkvLyBsw6puIHRyw6puCglpZiAocGF0aFtpXSA9PSAnVScgfHwgcGF0aFtpXSA9PSAnPycpIHsKCQlpZiAob2tfdXApIGJhY2t0cmFjayhpICsgMSwgeCAtIDEsIHkpOwoJfQoKCS8vIGLGsOG7m2MgcXVheSBsdWkKCXZpc2l0ZWRbeF1beV0gPSBmYWxzZTsgCn0KIAppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAKCWNpbiA+PiBwYXRoOyAgIAoJYW5zID0gMDsgICAKCWJhY2t0cmFjaygwLCAxLCAxKTsgIAoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCglyZXR1cm4gMDsgCn0J