#include <string>
#include <vector>
#include <algorithm>
using namespace std;

#define UP 0
#define RIGHT 1
#define DOWN 2
#define LEFT 3

int g_cache[4][500][500][4] = {};
int g_visited[4][500][500] = {};
int g_ans[4] = {};
int dx[] = {010, -1}, dy[] = {-1010};
int WH;

int rotate(int dirchar cmd) {
    if (cmd == 'L') {
        if (dir == UPdir = LEFT;
        else --dir;
    } else if (cmd == 'R') {
        if (dir == LEFTdir = UP;
        else ++dir;
    }
    return dir;
}

bool move(int &xint &yint &dirchar cmdint idx) {
    dir = rotate(dircmd);

    if (g_cache[idx][y][x][dir]) return false;

    g_cache[idx][y][x][dir] = 1;

    x += dx[dir]; y += dy[dir];

    if (x == -1x = W - 1;
    else if (x == Wx = 0;
    else if (y == -1y = H - 1;
    else if (y == Hy = 0;

    return true;
}

vector<intsolution(vector<stringgrid) {
    vector<intanswer;
    int ixyanscntdirj;
    W = grid[0].size(); H = grid.size();

    for (i = 0i < 4; ++i) {
        // init
        x = y = ans = 0
        cnt = 1;
        dir = i;
        g_visited[i][y][x] = 1;

        // logic
        while (move(xydirgrid[y][x]i)) {
            if (!g_visited[i][y][x]) {
                ++cnt;
                g_visited[i][y][x] = 1;
            }
            ++ans;
        }

        // exception
        if (x != 0 || y != 0 || cnt != W * H || dir != rotate(igrid[0][0]) || ans == 0continue;
        for (j = 0j < i; ++j) {
            if (g_cache[j][0][0][dir] && ans == g_ans[j]) break;
        }
        if (j != icontinue;

        // answer
        g_ans[i] = ans;
        answer.push_back(ans);
    }

    sort(answer.begin(), answer.end());

    return answer;
}


다 뒤질래 진짜