# PBinfo #2978 – aur – Rezolvare C++

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

## Enunț

După ce au mers împreună prin lume, Păcală și Tândală au strâns o căruță plină de bănuți de aur, iar acum îi răstoarnă pe toți în curtea casei și îi împart în N grămezi. Păcală numără bănuții din fiecare grămadă și îi dictează lui Tândală N numere naturale pe care acesta trebuie să le scrie în ordine pe o tăbliță. După ore bune de muncă, Păcală constată că Tândală a scris pe un singur rând, în ordine, de la stânga la dreapta, toate numerele dictate de el, dar lipite unul de altul. Acum pe tăbliță e doar un șir lung de cifre. Ce să facă Păcală acum?

Cerința
Cunoscând cele N numere naturale dictate de Păcală, scrieți un program care să determine:
1. numărul cifrelor scrise pe tăbliță de Tândală;
2. ce-a de-a K-a cifră de pe tăbliță, în ordine de la stânga la dreapta;
3. cel mai mare număr ce se poate forma cu exact P cifre alăturate de pe tăbliță, considerate în ordine de la stânga la dreapta.

Date de intrare
Fișierul de intrare aur.in conţine:
- pe prima linie un număr natural C care reprezintă numărul cerinței și poate avea valorile 1, 2 sau 3.
- pe cea de-a doua linie un număr natural N dacă cerința este 1, sau două numere naturale N și K (despărțite printr-un spațiu) dacă cerința este 2, sau două numere naturale N și P (despărțite printr-un spațiu) dacă cerința este 3.
- pe cea de-a treia linie, N numere naturale despărțite prin câte un spațiu, ce reprezintă, în ordine, numerele pe care Păcală i le dictează lui Tândală.

Date de ieșire
Fișierul de ieșire aur.out va conține pe prima linie un singur număr natural ce reprezintă rezultatul determinat conform fiecărei cerințe.

Restricții și precizări

1 ≤ N ≤ 100.000 și 1 ≤ K ≤ 900.000;
Se garantează ca există cel puțin K cifre scrise pe tăbliță.
1 ≤ P ≤ 18; Se garantează ca există cel puțin P cifre scrise pe tăbliță.
toate numere dictate de Păcală sunt nenule și au cel mult 9 cifre fiecare;
Pentru rezolvarea corectă a primei cerințe se acordă 20 de puncte, pentru rezolvarea corectă a celei de-a doua cerințe se acordă 30 de puncte, iar pentru rezolvarea corectă a celei de-a treia cerințe se acordă 40 de puncte.
În concurs s-au acordat 10 puncte din oficiu. Aici se acordă pentru exemplele din enunț.

Exemplul 1:
aur.in

1
7
25 9 13 459 2 79 9
aur.out

12
Explicație
Se rezolvă cerința 1. Tândală a scris pe tăbliță: 259134592799. Numărul cifrelor scrise de Tândală este 12.

Exemplul 2:
aur.in

2
7 10
25 9 13 459 2 79 9
aur.out

7
Explicație
Se rezolvă cerința 2. N are valoarea 7 și K are valoarea 10. Pe tăbliță este scris: 259134592799, cea de-a zecea cifră este 7.

Exemplul 3:
aur.in

3
7 4
25 9 13 459 2 79 9
aur.out

9279
Explicație
Se rezolvă cerința 3. N are valoarea 7 și P are valoarea 4. Tândală a scris pe tăbliță: 259134592799. Cel mai mare număr format din patru cifre este 9279.

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
ifstream in("aur.in");
ofstream out("aur.out");
unsigned char v[900001];
unsigned long long maxim;
long long n, k, p, temp = 0, x, poz, C;
int nrcif(int n) {
    int nrcif = 0;
    while (n != 0) {
        nrcif++;
        n = n / 10;
    } return nrcif;
}
int oglindit(int n) {
    int nr = 0;
    while (n != 0) {
        nr = nr * 10 + n % 10;
        n = n / 10;
    } return nr;
}
int main() {
    in >> C;
    if (C == 1) {
        int S = 0;
        in >> n;
        for (int i = 1; i <= n; i++)
            in >> x, S = S + nrcif(x);
        out << S;
    }
    else if (C == 2) {
        in >> n >> k;
        for (int i = 1; i <= n; i++) {
            in >> x;
            int oglinda = oglindit(x);
            while (x % 10 == 0) {
                temp++;
                x = x / 10;
                if (temp == k) out << 0;
            }
            while (oglinda != 0) {
                temp++;
                if (temp == k) out << oglinda % 10;
                oglinda = oglinda / 10;
    } } }
    else {
        in >> n >> p;
        for (int i = 1; i <= n; i++) {
            in >> x;
            int oglinda = oglindit(x), l = 0;
            while (x % 10 == 0) l++, x = x / 10;
            while (oglinda != 0) {
                v[++poz] = oglinda % 10;
                oglinda = oglinda / 10;
            } while(l)
                v[++poz] = 0, l--;
        }
        for (int i = 1; i <= poz - p + 1; i++) {
            unsigned long long rez = 0;
            for (int j = 1; j <= p; j++)
                rez = rez * 10 + v[i + j - 1];
            if (rez > maxim) maxim = rez;
        } out << maxim;
    }
}
```

## Resurse

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