/// https://www.pbinfo.ro/probleme/1677/tort #include #include using namespace std; ifstream cin("tort.in"); ofstream cout("tort.out"); char mat[505][505]; int dp[505][505]; bool valid(int i, int j , int l) { if(mat[i][j]=='X') return false; if(mat[i-l+1][j]=='X') return false; if(mat[i][j-l+1]=='X') return false; if(mat[i-l+1][j-l+1] == 'X') return false; return true; } void update(int pi, int pj, int l) { for(int i = pi-l+1;i<=pi;i++) for(int j = pj-l+1;j<=pj;j++) mat[i][j] = 'X'; } int main() { int n , m, maxL = -1e9 ; cin>>n>>m; //Construim dp[i][j] = patratul de latura maxima cu coltul din dreapta-jos in (i,j) for(int i = 1;i<=n;i++) for(int j = 1;j<=m;j++) { cin>>mat[i][j]; dp[i][j] = 1; if(mat[i][j]==mat[i-1][j]&&mat[i][j]==mat[i][j-1]&&mat[i][j]==mat[i-1][j-1]) dp[i][j] = min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1; maxL = max(maxL,dp[i][j]); } int p = 0; for(int k = maxL;k>0;k--) { for(int i = 1;i<=n;i++) for(int j = 1;j<=m;j++) { if(dp[i][j]>=k&&valid(i,j,k)) { cout<