func_code_string: #include <bits/stdc++.h>   const int dx[4] = {1, 0, -1, 0};   const int dy[4] = {0, -1, 0, 1};   using namespace std;   char str[5001];   class Point {    public:     int Left;     int Right;     int Up;     int Down;   };   Point f1[5001], f2[5001];   int ans1, ans2, n, m;   int dfs(int p, int tot) {     int tmp;     if (str[p] ==  D )       tmp = f2[p].Down;     else if (str[p] ==  U )       tmp = f2[p].Up;     else if (str[p] ==  L )       tmp = f2[p].Left;     else       tmp = f2[p].Right;     if (f2[p].Left != -1) f2[f2[p].Left].Right = f2[p].Right;     if (f2[p].Right != -1) f2[f2[p].Right].Left = f2[p].Left;     if (f2[p].Up != -1) f2[f2[p].Up].Down = f2[p].Down;     if (f2[p].Down != -1) f2[f2[p].Down].Up = f2[p].Up;     if (ans1 == tot) ans2++;     if (ans1 < tot) {       ans1 = tot;       ans2 = 1;     }     if (tmp != -1) dfs(tmp, tot + 1);     return 0;   }   int work() {     scanf( %d%d , &n, &m);     getchar();     for (int i = 0; i < n; ++i) {       for (int j = 0; j < m; ++j) str[i * m + j] = getchar();       getchar();     }     memset(f1, -1, sizeof(f1));     memset(f2, -1, sizeof(f2));     int k;     for (int i = 0; i < n; ++i)       for (int j = 0; j < m; ++j) {         int p = i * m + j;         if (str[p] ==  . ) continue;         {           k = i + 1;           while (str[k * m + j] ==  .  && k < n) k++;           if (k < n) {             f1[p].Down = k * m + j;             f1[k * m + j].Up = p;           }         }         {           k = i - 1;           while (str[k * m + j] ==  .  && k >= 0) k--;           if (k >= 0) {             f1[p].Up = k * m + j;             f1[k * m + j].Down = p;           }         }         {           k = j - 1;           while (str[i * m + k] ==  .  && k >= 0) k--;           if (k >= 0) {             f1[p].Left = i * m + k;             f1[i * m + k].Right = p;           }         }         {           k = j + 1;           while (str[i * m + k] ==  .  && k < m) k++;           if (k < m) {             f1[p].Right = i * m + k;             f1[i * m + k].Left = p;           }         }       }     ans1 = ans2 = 0;     for (int i = 0; i < n; ++i)       for (int j = 0; j < m; ++j)         if (str[i * m + j] !=  . ) {           for (int k = 0; k < 5001; ++k) f2[k] = f1[k];           dfs(i * m + j, 1);         }     printf( %d %d n , ans1, ans2);     return 0;   }   int main() {     work();     return 0;   }   