# PBinfo #1439 – Sir6 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Se dă un şir de N numere naturale. Din acest şir, putem forma un şir comprimat de forma:  a[1], b[1], a[2], b[2], …, a[x], b[x], din care înţelegem că numărul a[1] apare pe primele b[1] poziţii, a[2] apare pe următoarele b[2] poziţii…, iar a[x] apare pe ultimele b[x] poziţii.

De exemplu, dacă şirul dat este 1 1 5 5 5 2, atunci şirul comprimat va fi 1 2 5 3 2 1.

Cerința
Să se determine:

a) Lungimea celei mai lungi secvenţe formată din numere egale.
b) Şirul comprimat pentru şirul dat.

Date de intrare
Fișierul de intrare sir6.in conține pe prima linie numerele P şi N. Pe următoarea linie se găseşte un şir format din N numere naturale.

Date de ieșire
Fișierul de ieșire sir6.out va conține pe prima linie:
a) Dacă P este 1, lungimea celei mai lungi secvenţe, reprezentând răspunsul la cerinţa a).
b) Dacă P este 2, şirul comprimat, reprezentând răspunsul la cerinţa b).

Restricții și precizări

N <= 100.000
Numerele din şir nu depăşesc 1.000.000.
P este 1 sau 2.

Exemplul 1
sir6.in

1 6
1 1 5 5 5 2
sir6.out

3
Explicație
Pentru acest test P = 1, deci se va rezolva doar cerinţa a). Secvenţa cea mai lungă formată din numere egale este: 5 5 5 şi are lungimea 3.

Exemplul 2
sir6.in

2 6
1 1 5 5 5 2
sir6.out

1 2 5 3 2 1
Explicație
Pentru acest test P = 2, deci se va rezolva doar cerinţa b). Numărul 1 apare de 2 ori, numărul 5 apare de 3 ori, iar numărul 2 apare o singură dată. Prin urmare, şirul comprimat este 1 2 5 3 2 1.

## Cod sursă C++

```cpp
/*
    Author: Rusu Daniel
    Complexity: O(N)
    Verdict: 100/100
*/
#include <fstream>
using namespace std;
ifstream fin("sir6.in");
ofstream fout("sir6.out");
int P, N, x, mx;
int main() {
    fin >> P >> N;
    int prec = -1;
    int app = 0;
    for(int i = 1; i <= N; ++i) {
        fin >> x;
        if(x != prec) {
            if(P == 2 && prec >= 0) {
                fout << prec << ' ' << app << ' ';
            }
            else {
                mx = max(mx, app);
            }
            prec = x;
            app = 1;
        }
        else {
            ++app;
        }
    }
    mx = max(mx, app);
    if(P == 1) {
        fout << mx;
    }
    else {
        fout << prec << ' ' << app;
    }
    fout << '\n';
    fin.close();
    fout.close();
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1439)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1439/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1439/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
