# PBinfo #2205 – permrep – Rezolvare C++

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

## Enunț

Se consideră un cuvânt C format din litere mici, nu neapărat distincte. 

Cerința
Să se afișeze în ordine lexicografică toate cuvintele distincte formate cu exact aceleași caractere ca și C.

Date de intrare
Fișierul de intrare permrep.in conține pe prima linie cuvântul C.

Date de ieșire
Fișierul de ieșire permrep.out va conține pe câte o linie un cuvânt care are exact aceleași litere ca și C.

Restricții și precizări

Cuvântul C va avea lungimea de cel mult 9

Exemplu:
permrep.in

mama
permrep.out

aamm
amam
amma
maam
mama
mmaa

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
#define nmax 15
using namespace std;
int st[nmax], n, N;
char cuv[nmax]; /// cuvantul citit
char lit[nmax]; /// lit[i] memoreaza o litera distincta din cuv[]
int nr[nmax];  /// nr[i]=de cate ori apare lit[i] in cuv[]
ifstream fin("permrep.in");
ofstream fout("permrep.out");
void CitireMemorare()
{
    int i, j;
    fin >> cuv;
    N = strlen(cuv);
    n = 0;
    for (i = 0; cuv[i] != 0; i++)
    {
        /// cauta litera cuv[i] in lit[]
        for (j = 1; j <= n && cuv[i] != lit[j]; j++)
            ;
        if (j > n) /// cuv[i] nu apare in lit[]
        {
            n++;
            lit[n] = cuv[i];
            nr[n] = 1;
        }
        else nr[j]++;
    }
    /// sorteaza literele crescator in lit[]
    for (i = 1; i < n; i++)
        for (j = i + 1; j <= n; j++)
            if (lit[i] > lit[j])
            {
                char ch = lit[i];
                lit[i] = lit[j];
                lit[j] = ch;
                int x = nr[i];
                nr[i] = nr[j];
                nr[j] = x;
            }
}
void Afisare()
{
    for (int i = 1; i <= N; i++)
        fout << lit[st[i]];
    fout << "\n";
}
void Back(int top)
{
    if (top == N + 1) Afisare();
    else for (int i = 1; i <= n; i++)
        if (nr[i] > 0)
        {
            nr[i]--;
            st[top] = i;
            Back(top + 1);
            nr[i]++;
        }
}
int main()
{
    CitireMemorare();
    Back(1);
    return 0;
}
```

## Resurse

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