func_code_string: #include <bits/stdc++.h>   using namespace std;   const int L = 0, R = 1, U = 2, D = 3;   const int maxn = 5005;   class Node {    public:     int dir, l, r, u, d;   } a[maxn], b[maxn];   int n, m;   char s[maxn];   inline int id(int x, int y) { return x * m + y; }   inline void build(int x, int y) {     Node &u = a[id(x, y)];     int nx, ny;     for (nx = x, ny = y - 1; ny >= 0 && s[id(nx, ny)] ==  . ; --ny)       ;     if (ny < 0)       u.l = -1;     else       u.l = id(nx, ny);     for (nx = x, ny = y + 1; ny < m && s[id(nx, ny)] ==  . ; ++ny)       ;     if (ny >= m)       u.r = -1;     else       u.r = id(nx, ny);     for (nx = x - 1, ny = y; nx >= 0 && s[id(nx, ny)] ==  . ; --nx)       ;     if (nx < 0)       u.u = -1;     else       u.u = id(nx, ny);     for (nx = x + 1, ny = y; nx < n && s[id(nx, ny)] ==  . ; ++nx)       ;     if (nx >= n)       u.d = -1;     else       u.d = id(nx, ny);     return;   }   inline void connectX(int u, int v) {     if (~u) b[u].r = v;     if (~v) b[v].l = u;   }   inline void connectY(int u, int v) {     if (~u) b[u].d = v;     if (~v) b[v].u = u;     return;   }   inline void erase(int u) {     connectX(b[u].l, b[u].r);     connectY(b[u].u, b[u].d);     return;   }   inline void dfs(int x, int &res) {     Node &u = b[x];     ++res;     if (u.dir == L) {       if (!~u.l) return;       erase(x);       dfs(u.l, res);     } else if (u.dir == R) {       if (!~u.r) return;       erase(x);       dfs(u.r, res);     } else if (u.dir == U) {       if (!~u.u) return;       erase(x);       dfs(u.u, res);     } else {       if (!~u.d) return;       erase(x);       dfs(u.d, res);     }     return;   }   int main() {     cin >> n >> m;     for (int i = (0); i < (n); ++i) {       string buf;       cin >> buf;       for (int j = (0); j < (m); ++j) {         s[id(i, j)] = buf[j];         if (buf[j] ==  L )           a[id(i, j)].dir = L;         else if (buf[j] ==  R )           a[id(i, j)].dir = R;         else if (buf[j] ==  U )           a[id(i, j)].dir = U;         else if (buf[j] ==  D )           a[id(i, j)].dir = D;       }     }     for (int x = (0); x < (n); ++x)       for (int y = (0); y < (m); ++y)         a[id(x, y)].l = a[id(x, y)].r = a[id(x, y)].u = a[id(x, y)].d = -1;     for (int x = (0); x < (n); ++x)       for (int y = (0); y < (m); ++y) build(x, y);     int ans = 0, cnt = 0;     for (int i = (0); i < (n); ++i)       for (int j = (0); j < (m); ++j)         if (s[id(i, j)] !=  . ) {           for (int x = (0); x < (n); ++x)             for (int y = (0); y < (m); ++y) b[id(x, y)] = a[id(x, y)];           int res = 0;           dfs(id(i, j), res);           if (res > ans)             ans = res, cnt = 1;           else if (res == ans)             ++cnt;         }     printf( %d %d n , ans, cnt);     return 0;   }   