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 șiruluiS ≤ 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 .
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!