CCCPaste

Tort ONI X 2016

/// 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<