O parantezare corectă se obține aplicând una dintre următoarele reguli:
- șirul vid este o parantezare corectă;
- dacă este o parantezare corectă, atunci
(S)
este o parantezare corectă, iar cele două paranteze(
și)
care încadrează șirulS
sunt denumite paranteze pereche; - dacă , , , sunt parantezări corecte atunci șirul obținut prin concatenarea acestora este o parantezare corectă.
De exemplu șirurile ()
, ()()
, (())
și (()())()
reprezintă parantezări corecte, în timp ce )(
, ()()(
și (()())))
nu sunt parantezări corecte.
Fie un șir care reprezintă o parantezare corectă. Pentru fiecare dintre parantezele pereche din șirul asociem un cost egal cu diferența dintre poziția pe care se află în paranteza închisă și poziția parantezei deschise pereche. Pozițiile în șir le considerăm numerotate începând cu . Costul total al unei parantezări corecte îl reprezintă suma costurilor tuturor parantezelor pereche din aceasta.
De exemplu, șirul (()())
este format din trei paranteze pereche, situate pe pozițiile și , apoi și , respectiv și . Costul total al parantezării este - + - + - = .
Numim operație swap interschimbarea a două paranteze situate în șir pe poziții alăturate. Această operație este validă doar dacă șirul nou obținut este la rândul său o parantezare corectă și dacă noua parantezare are costul total strict mai mic decât cea inițială.
Cerință
Scrieți un program care citește o succesiune de caractere reprezentând o parantezare corectă și determină:
- Costul total asociat parantezării citite;
- Costul minim al unei parantezări obținute prin efectuarea unei singure operații swap valide asupra parantezării citite;
- Numărul de posibilități de a efectua o singură operație swap validă asupra parantezării inițiale pentru a obține costul determinat conform cerinței 2.
Date de intrare
Fișierul de intrare swap.in
conține pe prima linie numărul natural și pe a doua linie o succesiune de caractere reprezentând o parantezare corectă.
Date de ieșire
În fișierul de ieșire swap.out
va conține pe prima linie un număr natural reprezentând costul parantezării citite. A doua linie va conține un număr natural reprezentând costul minim determinat conform cerinței 2 sau valoarea când nu se poate efectua nici o operație swap validă asupra parantezării citite. A treia linie a fișierului va conține un număr natural reprezentând răspunsul la cerința 3 sau dacă numărul afișat conform cerinței 2 a fost .
Restricții și precizări
- ;
- Pe fiecare dintre cele linii ale fișierului de ieșire trebuie să se afle un singur număr întreg. Dacă numărul de pe prima linie este corect, se acordă % din punctajul testului. Dacă numărul de pe a doua linie este corect, se acordă % din punctaj. Dacă numărul de pe a treia linie este corect, se acordă % din punctaj.
Exemplu
swap.in
8
()(())()
swap.out
6
4
1
Explicație
Pentru cerința 1 costul parantezării este . Executând o operație swap între parantezele de pe pozițiile și se obține șirul ()()()()
care are costul , aceasta fiind singura posibilitate de a obține acest cost.