Rezolvare completă PbInfo #2088 decodif

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

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema decodif:

#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;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2088 decodif

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2088 decodif de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!