#include <bits/stdc++.h>

#define pb push_back
#define mp make_pair
#define mt make_tuple

#define pii pair<int,int>
#define tii tuple <int,int,int>
#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, k, mx, poz;
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++) {
        mx = 0;

        for(j = m - 1; j + 1; j--)
            if(s[i][j] == '1') {
                if(mx)
                    if(up[i][j] > 1)sol = max(sol, poz - j - 1 + up[i][j] + up[i][poz]);

                mx++;

                if(up[i][j] > 1) {
                    if(mx < up[i][j]) {
                        mx = up[i][j];
                        poz = j;
                    }
                }
            }
            else
                mx = 0;
    }

    cout << sol;
    return 0;
}