# PBinfo #2230 – palindrom3 – Rezolvare C++

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

## Enunț

Gigel a învăţat la şcoală un nou cuvânt: palindrom. El ştie acum că un palindrom este o construcţie formată din litere sau/şi cifre care arată la fel citită de la început spre sfârşit sau citită de la sfârşit spre început. De exemplu numerele 2552 și 12321 au proprietatea de palindrom. Deoarece lui Gigel îi place să se joace cu cifrele, el îşi pune următoarea problemă: dat fiind un număr natural, pot fi rearanjate cifrele lui astfel încât să obţinem un palindrom? Dacă da, care este numărul maxim palindrom care poate fi obţinut?

Cerința
Fiind dat un număr natural n să se determine cel mai mare număr palindrom care se poate obţine cu cifrele numărului n.

Date de intrare
Fișierul de intrare palindrom3.in conţine pe prima linie numărul natural n.

Date de ieșire
Fișierul de ieșire palindrom3.out conţine pe prima linie cel mai mare număr palindrom care se poate obţine cu cifrele numărului n.

Restricții și precizări

0 < n < 2 147 483 648
Pentru datele de test există întotdeauna soluţie

Exemplu:
palindrom3.in

3121321
palindrom3.out

3211123

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
ifstream in("palindrom3.in");
ofstream out("palindrom3.out");
#define cin in
#define cout out
int freq[11], n, nrimp = 0;
int main() {
    cin >> n;
    if (n < 10) 
        cout << n;
    else if (n > 9) {
        while (n > 0) {
            freq[n % 10]++;
            n = n / 10;
        } bool adv = true;
        for (int i = 0; i <= 9; i++)
            if (freq[i] % 2 == 1)
                nrimp++;
        if (nrimp > 1)
            adv = false;
        if (adv) { bool pare = false;
            for (int i = 1; i <= 9; i++)
                if (freq[i] && freq[i] % 2 == 0)
                    pare = true;
            int imp = -1;
            for (int i = 0; i <= 9; i++)
                if (freq[i] % 2 == 1)
                    imp = i;
            if (freq[imp] == 1 && imp >= 0 && pare == 0 && freq[0] % 2 == 0)
                cout << "-1";
            else {
                for (int i = 9; i >= 0; i--) 
                    for (int j = 1; j <= freq[i] / 2; j++)
                        cout << i;
                if (imp >= 0)
                    cout << imp;
                for (int i = 0; i <= 9; i++)
                    for (int j = 1; j <= freq[i] / 2; j++)
                        cout << i;
            }
        } else
            cout << "-1";
    } return 0;
}
```

## Resurse

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