fbpx

Problema #3376 – asciimat – Rezolvari PBInfo

de Mihai-Alexandru

Se dă un şir de caractere S format din litere mari şi mici ale alfabetului englez, spaţii şi caracterul ce are codul ASCII 127. Fiecare caracter al lui S se codifică printr-o succesiune de 1 şi 0 ce reprezintă codul ASCII al caracterului în baza 2. Codul începe cu cifra 1, astfel pentru caracterul A codificarea este 1000001. Un cuvânt poate fi format din litere şi caracterul . Se consideră matricea M formată din cuvintele șirului S codificate şi memorate pe câte o linie în ordinea în care se găsesc acestea în propoziție.

Cerința

Scrieţi un program care, cunoscând S şi K, rezolvă următoarele două cerinţe:

Se dă un şir de caractere S format din litere mari şi mici ale alfabetului englez, spaţii şi caracterul ce are codul ASCII 127. Fiecare caracter al lui S se codifică printr-o succesiune de 1 şi 0 ce reprezintă codul ASCII al caracterului în baza 2. Codul începe cu cifra 1, astfel pentru caracterul A codificarea este 1000001. Un cuvânt poate fi format din litere şi caracterul . Se consideră matricea M formată din cuvintele șirului S codificate şi memorate pe câte o linie în ordinea în care se găsesc acestea în propoziție.

Cerința

Scrieţi un program care, cunoscând S şi K, rezolvă următoarele două cerinţe:
1. determină L, latura celui mai mare pătrat din matricea M ce conține doar valori de 1;
2. determină NR, câte pătrate de latura K cu toate elementele egale cu 1 există în matricea M.

Date de intrare

Fișierul de intrare asciimat.in conţine pe prima linie cerinţa care trebuie să fie rezolvată (1 sau 2). Pe a doua linie se află șirul S, iar pe a treia linie se află valoarea K, având semnificaţia din enunţ.

Date de ieșire

Dacă cerinţa este 1, fişierul de ieşire asciimat.out va conţine o singură linie pe care va fi scris L, latura celui mai mare pătrat din matricea M ce conține doar valori de 1.
Dacă cerinţa este 2, fişierul de ieşire asciimat.out va conţine o singură linie pe care va fi scris NR, câte pătrate de latura K cu toate elementele egale cu 1 există în matricea M.

Restricții și precizări

  • şirul S are cel mult 3000 de caractere
  • 3 ≤ K ≤ 50
  • lungimea unui cuvânt nu depăşeşte 100 de caractere
  • fiecare cuvânt este codificat pe o singură linie
  • fiecare literă este codificată pe 7 biţi
  • liniile conţin concatenarea codurilor ASCII ale literelor unui cuvânt, astfel restul valorilor rămase libere din cadrul unei linii vor avea valoarea 0.
  • numărul de cuvinte din şir nu depăşeşte valoarea 300.

Exemplul 1:

asciimat.in

1
Ana are mere
3

asciimat.out

3

Exemplul 2:

asciimat.in

2
Ana are mere
2

asciimat.out

7

Explicație

Matricea obţinută este:

1000001110111011000010000000
1100001111001011001010000000
1101101110010111100101100101

La poziția (1,8) în matrice este colţul stânga-sus al unui pătrat de latura 3 cu toate elementele egale cu 1.
Există 7 pătrate de latură 2 cu toate elementele egale cu 1.

#include <bits/stdc++.h>

using namespace std;

ifstream cin("asciimat.in");
ofstream cout("asciimat.out");

int cer , k , A[302][702] , n , m , maxi , cnt;
char s[3001];

int main()
{
    cin >> cer;
    cin.get();
    cin.getline(s , 3001);
    cin >> k;

    char *p;
    p = strtok(s , " ");
    while(p != 0)
    {
        n++;
        int c = 0;
        for(int i = 0 ; p[i] ; i++)
        {
            int x[8] = {0} , j = 0;
            int val = p[i];
            while(val)
            {
                x[++j] = val % 2;
                val /= 2;
            }
            for(int j = 7 ; j >= 1 ; j--)
                A[n][++c] = x[j];
        }
        if(c > m) m = c;
        p = strtok(NULL , " ");
    }

    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
            if(A[i][j] == 1)
            {
                A[i][j] += min(A[i - 1][j - 1] , min(A[i - 1][j] , A[i][j - 1]));
                if(A[i][j] > maxi) maxi = A[i][j];
            }
    if(cer == 1) cout << maxi;
    else
    {
        for(int i = 1 ; i <= n ; i++)
        {
            for(int j = 1 ; j <= m ; j++)
                if(A[i][j] >= k) cnt++;
        }
        cout << cnt;
    }

}
Comentarii

S-ar putea sa iti placa