# PBinfo #3707 – forta1 – Rezolvare C++

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

## Enunț

Definim forța unui element într-un șir ca fiind valoarea obținută considerând numărul de cifre pe care el le are în comun cu fiecare din celelalte elemente ale șirului și însumând aceste valori. De exemplu în șirul (12131, 1243, 15141) elementul 12131 are forța 6, deoarece 12131 are în comun cu 1243 trei cifre (1, 2 și 3) iar cu 15141 are în comun trei cifre (cele 3 cifre 1).

Cerința
Se dă un șir cu n elemente numere naturale. Să se sorteze elementele din șir în ordine crescătoare a forței, iar acele elemente care au aceeași forță să apară în ordine inversă decât apăreau inițial în șir.

Date de intrare
Fișierul de intrare forta.in conține pe prima linie n, numărul de elemente din șir, iar pe a doua linie n numere naturale separate prin câte un spațiu, reprezentând elementele șirului.

Date de ieșire
Fișierul de ieșire forta.out va conține pe prima linie, separate prin câte un spațiu, elementele șirului în ordinea cerută.

Restricții și precizări

1 ≤ n ≤ 1000
elementele șirului sunt numere naturale mai mici sau egale cu 1018
pentru teste în valoare de 30 de puncte elementele șirului vor avea forțe distincte

Exemplu:
forta.in

4
123 121 12314 1234
forta.out

121 123 1234 12314

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
#define N 1010
ifstream f("forta.in");
ofstream g("forta.out");
long long a[N], b[N];
int forta[19*N], n, poz[19*N], nn;
int main()
{
    f>>n;
    int i;
    for(i=1; i<=n; i++)f>>a[i];
    for(i=1; i<=n; i++)
    {
        int fri[10] = {}, j;
        long long x=a[i];
        do
        {
            fri[x%10]++;
            x/=10;
        }
        while(x);
        for(j=1; j<=n; j++)
            if(i!=j)
            {
                int frj[10] = {};
                x=a[j];
                do
                {
                    frj[x%10]++;
                    x/=10;
                }
                while(x);
                for(int k=0; k<=9; k++)
                    forta[i]+=min(fri[k], frj[k]);
            }
        poz[forta[i]]++;
        nn=max(nn, forta[i]);
    }
    for(i=1; i<=nn; i++) poz[i]+=poz[i-1];
    for(i=1; i<=n; i++) b[poz[forta[i]]]=a[i], poz[forta[i]]--;
    for(i=1; i<=n; i++) g<<b[i]<<' ';
    return 0;
}
```

## Resurse

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