# j's code challenge hold by connect job
```cpp=
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
void myprint(vector<vector<int>> B) {
for (int i=0;i<B.size();++i) {
for (int j=0;j<B[i].size();++j) {
cout<<B[i][j]<<" ";
}
cout<<endl;
}
}
int soln(vector<vector<int>> A) {
int R = A.size(); // num of row
int C = A[0].size(); // num of col
// matrix A, max to 500*500
// 0 0 0 1 1 1 1 1 0 1 1 0 0 1 1 1 // A[][]
// 0 0 0 5 4 3 2 1 0 2 1 0 0 3 2 1 // B_row[][]
// 500 is enough
int B_row [501][501] = {}; // B_row[i][j] = A[i][j] +~ A[i][k] // where continuous 1 for j~k
int B_col [501][501] = {}; // by default initiate as 0s
int B [501][501] = {}; // B[i][j] is the max of B_row[i][j] and B_col[i][j]
int ct_len = 1 + ((min(R, C) >> 1) << 1);
// ((min(R, C) >> 1) << 1) is the possible max ans // +1 just for for-loop bound check
int pre = 0; // previous
for (int i = 0; i < R; ++i) {
pre = 0; // reset for each row // take care of boundary issue
for (int j = C - 1; j >= 0; --j) { // right to left
if (A[i][j] == 1) {
if (pre == 1) { // 1 here and 1 before // accumulate it
B_row[i][j] = B_row[i][j + 1] + 1;
} else {
B_row[i][j] = 1; // a new star of a continuous row
}
}
pre = A[i][j]; // update pre
}
}
for (int j = 0; j < C; ++j) {
pre = 0;
for (int i = 0; i < R; ++i) { // up to down
if (A[i][j] == 1) {
if (pre == 1) {
// useless judgment !
if (i - 1 >= 0) { // i>=1
B_col[i][j] = B_col[i - 1][j] + 1;
} else { // i==0
B_col[i][j] = 1;
}
} else {
B_col[i][j] = 1;
}
}
pre = A[i][j];
}
}
// take min
for (int i = 0; i < R; ++i) {
for (int j = 0; j < C; ++j) {
B[i][j] = min(B_row[i][j],B_col[i][j]);
}
}
int ct [501]; // only use even 2,4,6...th element // 500 is enough
int ans = 0;
// [1 ~ R-1][0] // scan diagonal from top to bottom // within diagonal, from bottom to top
for (int s = 1; s < R; ++s) {
for (int t = 0; s - t >= 0 && t < C; ++t) {
for (int l = 2; l < ct_len; l += 2) { // l:=side length of fat L-shape
// start from 2 // step by 2// don't exceed ((min(R, C) >> 1) << 1)
if (B[s-t][t] >= l - ct[l]) { // for fat L-shape with sidelen l, we need slim L's of 2l*2l~l*l
++ct[l];
} else {
ct[l] = 0;
}
if (l >> 1 == ct[l]) {
ans = max(ans, l);
}
}
}
// reset C
for (int l = 2; l < ct_len; l += 2) {
ct[l] = 0;
}
}
// [R-1][1 ~ C-2]
for (int s = 1; s < C - 1; ++s) {
for (int t = 0; R - 1 - t >= 0 && s + t < C; ++t) {
for (int l = 2; l < ct_len; l += 2) {
if (B[R - 1 - t][s + t] >= l - ct[l]) {
++ct[l];
} else {
ct[l] = 0;
}
if (l >> 1 == ct[l]) {
ans = max(ans, l);
}
}
}
// reset C
for (int l = 2; l < ct_len; l += 2) {
ct[l] = 0;
}
}
return ans / 2;
}
int main() {
//Solution s;
vector<vector<int>> A {{1,1,1,1,1,1},
{1,1,1,1,1,1},
{1,1,1,1,1,1},
{1,1,1,1,1,1},
{1,1,1,1,1,1}};
myprint(A);
int tmp = soln(A);
cout<<"ans"<<tmp<<endl;
}
```