#include using namespace std; ///--------------------------------------------------- const int BUFFER_SIZE = (1 << 16); char buffer[BUFFER_SIZE]; int position = BUFFER_SIZE; inline char getChar() { if ( position == BUFFER_SIZE ) { position = 0; fread(buffer, BUFFER_SIZE, 1, stdin); } return buffer[position++]; } inline int getInt() { register int a = 0; char ch; int sgn = 1; do { ch = getChar(); } while ( !isdigit(ch) && ch != '-' ); if ( ch == '-' ) { sgn = -1; ch = getChar(); } do { a = (a << 3) + (a << 1) + ch - '0'; ch = getChar(); } while ( isdigit(ch) ); return a * sgn; } ///--------------------------------------------------- const int MAX_N = 500 + 5; char A[MAX_N][MAX_N]; int maxNumb[MAX_N][MAX_N]; int main() { ///freopen("data.in", "r", stdin); int N, M; scanf("%d%d", &N, &M); for (int i = 1; i <= N; ++i) { static char s[MAX_N]; scanf("%s", s); for (int j = 0; j < M; ++j) A[i][j + 1] = s[j] - '0'; } for (int i = 1; i <= N; ++i) for (int j = 1; j <= M; ++j) if (A[i][j] == 0) maxNumb[i][j] = 0; else maxNumb[i][j] = 1 + maxNumb[i - 1][j]; int best = 0; static pair arr[MAX_N]; int dim = 0; for (int i = N; i >= 1; --i) { int j = 1; while (j <= M) { if (A[i][j] == 0) { j++; continue; } int k = j; while (k <= M && A[i][k] == 1) k++; k--; // cout << "DA " << j << " " << k << " " << i << endl; dim = 0; for (int p = j; p <= k; ++p) arr[ dim++ ] = {maxNumb[i][p], p}; sort(arr, arr + dim, [](const pair &x, const pair &y){return x.first > y.first;}); for (int n = 0; n < dim; ++n) for (int m = n + 1; m < dim; ++m) { //if (abs(k - j) - 1 + arr[n].first + arr[m].first < best) // break; best = max(best, abs(arr[n].second - arr[m].second) - 1 + arr[n].first + arr[m].first); } j = k + 1; } } if (best < 4) best = 0; printf("%d\n", best); return 0; }