# PBinfo #2088 – decodif – Rezolvare C++

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

## Enunț

Se consideră următorul model (pattern): n[string] care este echivalent cu șirul (string)(string)...(string) (string repetat de de n ori). Pornind de la acest model orice șir de caractere poate fi codificat.

Exemple :


Șir codificat 
Șir decodificat 


 1[a] 
 a 


 2[ab] 
 abab 


 2[a2[b]] 
 abbabb 


 3[b2[ca]] 
 bcacabcacabcaca 



Cerința
Fiind dat un șir de caractere corect codificat să se afișeze decodificarea acestuia. 

Date de intrare
Programul citește de la tastatură un șir de caractere S corect codificat.

Date de ieșire
Programul va afișa pe ecran un șir de caractere ce va reprezenta decodificarea șirului S.

Restricții și precizări

3 ≤ lungimea șirului S ≤ 1000
lungimea șirului decodificat  ≤ 100000
șirul S va conține doar caractere literă mică ale alfabetului englez

Exemplu:
Intrare

3[a1[b2[c]]]
Ieșire

abccabccabcc
Intrare

3[a2[c]]2[x3[y]]
Ieșire

accaccaccxyyyxyyy

## Cod sursă C++

```cpp
#include<bits/stdc++.h>
using namespace std;
stack <int> numar;
stack <char> subsir;
string S;
string decodif(string S){
    string aux = "", sol = "";
    for (int i = 0; i < (int) S.length(); ++i){
        int nr = 0;
        if (S[i] >= '0' && S[i] <='9'){
            while (S[i] >= '0' && S[i] <= '9'){
                nr = nr * 10 + (S[i] - '0');
                i++;
            }
            i--;
            numar.push(nr);
        }
        else if (S[i] == ']') {
            aux = "";
            nr = 0;
            if (! numar.empty()) {
                nr = numar.top();
                numar.pop();
            }
            while (! subsir.empty() && subsir.top()!='[' ) {
                aux = subsir.top() + aux;
                subsir.pop();
            }
            if (! subsir.empty() && subsir.top() == '[') subsir.pop();
            for (int j = 0; j < nr; j++)
                sol = sol + aux;
            for (int j = 0; j < (int) sol.length(); j++)
                subsir.push(sol[j]);
            sol = "";
        }
        else if (S[i] == '[') {
            if (S[i-1] >= '0' && S[i-1] <= '9')
                subsir.push(S[i]);
            else {
                subsir.push(S[i]);
                numar.push(1);
            }
        }
        else
            subsir.push(S[i]);
    }
    while (! subsir.empty()) {
        sol = subsir.top() + sol;
        subsir.pop();
    }
    return sol;
}
int main()
{
    cin >> S;
    cout << decodif(S) << '\n';
    return 0;
}
```

## Resurse

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