Preliminars:
En aquests preliminars expliquem qué és un mot ben-parentitzat sobre (,),[,]. Si ja teniu clar aquest concepte, podeu deixar de llegir els preliminars i anar directament a l’exercici en sí.
Un mot ben parentitzat és un string s format amb els caràcters d’obrir i tancar parèntesis o corxets, és a dir (,),[,], que cumpleix el següent. A base de reemplaçar la subseqüència () pel mot buit, i la subseqüència [] pel mot buit, tant com sigui possible, s s’acaba convertint en el mot buit.
Per exemple, considereu el mot (()[()[]]). Si reemplacem les dues ocurrències de () pel mot buit ens queda ([[]]). Ara, si reemplacem la ocurrència de [] pel mot buit ens queda ([]). Ara, si reemplacem la nova ocurrència de [] pel mot buit ens queda (). Finalment, si reemplacem la nova ocurrència de () pel mot buit ens queda el mot buit. Per tant, el mot inicial era ben parentitzat.
Considereu aquest altre exemple: ([()[])]. Si reemplacem la ocurrència de () i la ocurrència de [] per mots buits ens queda ([)]. Aquí ja no podem aplicar cap més reemplaçament. Per tant, el mot inicial no era ben-parentitzat.
Exercici:
Tindrem strings d’entrada sobre (,),[,] que poden no ser ben-parentitzats. Heu d’implementar un programa que, per a cada entrada, escriu la longitut del prefix més llarg ben-parentitzat.
Observació: Podeu seguir l’enfoc que considereu oportú, i podeu utilitzar qualsevol de les estructures de dades presentades al curs (string, vector, stack, queue, list, map, set) de la manera que considereu oportuna. Noteu, però, que enfocaments diferents poden donar lloc a solucions més o menys eficients, i que superin només els jocs de proves públics o tots els jocs de proves, de manera que la nota acabarà depenent d’això.
Entrada
L’entrada conté un nombre arbitrari de casos, un per línia. Cada cas consisteix en un string no buit sobre (,),[,].
Sortida
Per a cada cas d’string s d’entrada, escriviu en una línia la longitut del prefix més llarg de s que és ben-parentitzat.
Observació
Avaluació sobre 10 punts:
Entenem com a solució lenta una que és correcta, de cost major que lineal i capaç de superar els jocs de proves públics. Entenem com a solució ràpida una que és correcta, de cost lineal i capaç de superar els jocs de proves públics i privats.
Input
()([] []([])(]] (] [) () [] [()]([)] [(])[()] ([])[()] [()][[[[[ [[[[[()] ()[)(][] [(()()][()())]] (((]([])][))[(]](((( ([]([]))[])[()]( [][()](()()]([()())[()())) [([]([]))[])[(]][([]([]))[])[()) (()(())(()())((()())(()()))) [[](())(()())((()())(()()]]] [[][[]][[][]][[[][]][[][]]]]
Output
2 6 0 0 2 2 4 0 8 4 0 2 0 0 10 6 0 28 0 28
Input
[)(])]()() (()[[()][]])[[]]]([])[][()]()()[] [][[[][][]]()])(()(([](())[])()[]) (((])[))[][][] [[]]([]) (())([])(([[]][]) ][[()()]][] ((()[]([]))[])[]([[][[]][]][])()[]([]([()][]))[()] (())(()())[((()())[]] ()[]() [([()])] ((()())[](()))() (()])([]) []((())) ([][])(())[][()()](([[]]) ()()()([])][[] [(() [[]]()[]()())()[][] [()[()]()]][[([])]]() (([()])([]))[[]]([[][[]]]()[])[])([])()(())[()()] ([)])()](())() []()]([]() ([)]([]) ([[]()()])[][] [[]]]()([] [[](()))]]()(())() ([)[]]()[()] [([])] ((())())((()))[] [[[]]] [)[[[][]]()]([][[]])() []([]) [([])]()([]()[]) )[)][] ()[]() (([])(]))(())[]([[]][()()])() ()([()])([]())[][) [(())]()[] (()) ()
Output
0 16 14 0 8 8 0 50 10 6 8 16 0 8 18 10 0 12 10 32 0 4 0 14 4 0 0 6 16 6 0 6 16 0 6 0 16 10 4 2