# PBinfo #1953 – tabel1 – Rezolvare C++

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

## Enunț

Cerința
Marius se pregătește pentru olimpiada de informatică. Astăzi, profesoara lui i-a predat șirurile de caractere. După școală și-a lăsat caietul de informatică pe birou, și frățiorul lui, pus pe șotii, a deschis caietul la ultima lecție și a văzut scris mare: TABEL ASCII. Pentru că îi place să scrie, s-a gândit să modifice puțin numerele din tabel. Așa că a șters unele din ele, scriind altele în loc. Marius nu a observat acest lucru și a început să rezolve problemele date de doamna profesoară. Are nevoie de ajutor, de aceea te roagă să îl ajuți să rezolve următoarea problemă, folosind tabelul ascii din caietul său: “Se dă un șir de caractere format din cifre și litere mari și mici ale alfabetului englez. Afișați suma valorilor tuturor literelor (valoarea unei litere se află în tabelul Ascii) și cel mai mare număr vale-deal care se poate forma cu cifrele care apar în șir. Un număr vale-deal are cifre distincte și cifrele din prima jumătate sunt în ordine descrescătoare, iar dele din a doua jumătate în ordine crescătoare. Exemplu : 98367 e număr vale-deal, 998367 nu e număr vale-deal, 987 nu e număr vale-deal.”

Cunoscând șirul format din cifre zecimale, litere mici și litere mari ale alfabetului englez, respectiv numerele modificate de fratele lui Marius, scrieți un program care să determine:

a) suma codurilor ASCII ale literelor din sir (folosind tabelul din caietul lui Marius); 
b) cel mai mare număr vale-deal care are cifre ce apar în șir.

Date de intrare
Fișierul tabel1.in conține:


pe prima linie un număr natural n, ce reprezintă numărul de valori modificate de fratele lui Marius;
pe următoarele linii n perechi x y – x este caracterul ce are valoarea y în tabelul ascii
pe linia n + 2 un şir format din litere și cifre;

Date de ieșire
Fișierul de ieșire tabel1.out va conține:


pe prima linie suma literelor din șir;
pe a doua linie numărul vale-deal cu proprietățile enumerate în enunț.

Restricții și precizări

Şirul dat este format din cel mult 1000000 de litere şi cifre
Fratele lui Marius scrie numere naturale distincte nenule mai mici decât 65
0 <= n <= 50

Exemplu:
tabel1.in

4
a 1
b 2
e 3
l 4
tabel1234apa543216
tabel1.out

240
654123
Explicație
a) suma literelor e : 116(t) + 1(a) + 2(b) + 3(e) + 4(l) + 1(a) + 112(p) + 1(a) = 240
b) cifrele care apar sunt: 1, 2, 3, 4, 5, 6 și numărul vale-deal cu valoare maxima e 654123

## Cod sursă C++

```cpp
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("tabel1.in");
ofstream g ("tabel1.out");
int val['z' + 1],apare[12],n,k,j,s,i,y;
char x;
int main()
{
    f >> n;
    for(i = 1; i <= n; i++)
    {
        f >> x >> y;
        val[x] = y;
    }
    while(f >> x)
        if(isdigit(x)) // daca e cifra
            apare[x - '0']++; // vector de freventa in care contorizez cifrele care apar
        else if(val[x]) // daca e litera si a fost modificata in tabel
            s += val[x] ; // adaug la suma
        else s += x; // daca e litera si nu a fost modificata,adaug la suma
    g << s << '\n';
    for(i = 0;i <= 9;i++)
        if(apare[i])
        k++;
    // am contorizat cate cifre am in sir
    for(i = 9,j = 1;j <= k / 2;i--)
        if(apare[i])
        g << i,j++;
    // afisez prima jumatate din numarul deal-vale
    if(k % 2 == 0)
        j = 1;
    else j = 0;
    for(i = 0;j <= k / 2;i++)
        if(apare[i])
        g << i,j++;
    // afisez a doua jumatate din numarul deal-vale
    return 0;
}
```

## Resurse

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