#include #include #include using namespace std ; int r, c ; string b ; int d[4] ; int cd[256] ; int main() { cin >> r >> c ; string s ; for (int i=0; i<=c; i++) b.push_back('$') ; for (int i=0; i> s ; b += s ; b.push_back('$') ; } for (int i=0; i<=c; i++) b.push_back('$') ; d[0] = -c-1 ; d[1] = -1 ; d[2] = 1 ; d[3] = c+1 ; for (int i=0; i<256; i++) cd[i] = -1 ; cd[(int)'^'] = 0 ; cd[(int)'<'] = 1 ; cd[(int)'>'] = 2 ; cd[(int)'v'] = 3 ; vector typ(b.size()) ; vector path ; for (int i=0; i<=(int)b.size(); i++) if (cd[(int)b[i]] >= 0 && typ[i] == 0) { int at = i ; path.clear() ; while (1) { typ[at] = -1 ; path.push_back(at) ; int nxt = at + d[cd[(int)b[at]]] ; if (cd[(int)b[nxt]] < 0) { typ[at] = -4 ; path.pop_back() ; break ; } if (typ[nxt] == -1) { // new loop while (1) { at = path[path.size()-1] ; path.pop_back() ; typ[at] = -3 ; if (at == nxt) break ; } typ[at] = -5 ; break ; } else if (typ[nxt] != 0) { // ran into something explored break ; } at = nxt ; } for (auto v: path) typ[v] = -2 ; } vector cnts(b.size()) ; vector st ; int cnt = 0 ; int best = 0 ; auto visit = [&](int at) { for (int i=0; i<4; i++) { int dst = at + d[i] ; if (b[dst] == '#') { if (cnts[dst]++ == 0) cnt++ ; } } best = max(best, cnt) ; } ; auto unvisit = [&](int at) { for (int i=0; i<4; i++) { int dst = at + d[i] ; if (b[dst] == '#') { if (--cnts[dst] == 0) cnt-- ; } } } ; for (int i=0; i<(int)b.size(); i++) if (typ[i] <= -4) { path.clear() ; int at = i ; if (typ[at] == -5) { while (1) { at += d[cd[(int)b[at]]] ; visit(at) ; st.push_back(at) ; if (typ[at] == -5) { st.push_back(0) ; break ; } else { st.push_back(5) ; } } } else { visit(at) ; st.push_back(at) ; st.push_back(0) ; } while (st.size() > 0) { int dd = st[st.size()-1] ; at = st[st.size()-2] ; if (dd > 3) { unvisit(at) ; st.pop_back() ; st.pop_back() ; continue ; } st[st.size()-1] = dd + 1 ; int dst = at - d[dd] ; if (typ[dst] != -5 && cd[(int)b[dst]] != -1 && at == dst + d[cd[(int)b[dst]]]) { visit(dst) ; st.push_back(dst) ; st.push_back(0) ; } } } cout << best << endl ; }