#include #define pb push_back #define mp make_pair #define mt make_tuple #define pii pair #define tii tuple #define N 550 #define mod 1000000005 #define X first #define Y second #define eps 0.0000000001 #define all(x) x.begin(),x.end() #define tot(x) x+1,x+n+1 using namespace std; int sol, n, m, i, j, up[N][N], down[N][N], left1[N][N], x, y, xx, yy, l, ll; string s[N]; int main() { cin.sync_with_stdio(0); cout.sync_with_stdio(0); cin >> n >> m; for(i = 0; i < n; i++) { cin >> s[i]; } for(i = 0; i < n; i++) for(j = 0; j < m; j++) if(s[i][j] == '1') { if(j)left1[i][j] = left1[i][j - 1]; left1[i][j]++; if(i) up[i][j] = up[i - 1][j]; up[i][j]++; } for(i = n - 1; i + 1; i--) for(j = 0; j < m; j++) if(s[i][j] == '1') { if(i < n - 1)down[i][j] = down[i + 1][j]; down[i][j]++; } for(i = 0; i < n; i++) for(j = 0; j < m; j++) if(s[i][j] == '1' && down[i][j] > 1) { x = i; y = j; l = 1; while(s[x][y] == '1') { x++; l++; if(s[x][y] == '1' && s[x ][y + 1] == '1') { xx = x; yy = y; ll = 0; while(s[xx][yy] == '1') { yy++; ll++; if(up[xx][yy] > 1) sol = max(sol, l + ll + up[xx][yy] - 1); } } } } cout << sol; return 0; }