Dãy ngoặc (C.P.VNOI 2021 LMH R8)

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, Output, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 1500 Thời gian: 2.0s Bộ nhớ: 488M Input: parentheses.inp Output: parentheses.out

Một dãy dấu ngoặc hợp lệ là một xâu các ký tự () được định nghĩa như sau:

  • Xâu rỗng là một dãy dấu ngoặc hợp lệ
  • Nếu \(A\) là dãy dấu ngoặc hợp lệ thì \((A)\) là dãy dấu ngoặc hợp lệ
  • Nếu \(A\)\(B\) là hai dãy dấu ngoặc hợp lệ thì \(AB\) (xâu tạo thành bằng cách ghép xâu \(A\) với xâu \(B\)) là dãy dấu ngoặc hợp lệ

Những xâu không xây dựng được theo các quy tắc trên không phải là dãy dấu ngoặc hợp lệ. Ví dụ: ((()()))()()() là những dãy ngoặc hợp lệ, )()(((()) không phải là dãy ngoặc hợp lệ.

Yêu cầu: Cho xâu ký tự \(S\) chỉ gồm các ký tự \(\in \{′(′,′)′\}\), người ta cho phép bạn thực hiện (0 hoặc một số) phép biến đổi, mỗi phép biến đổi thuộc một trong hai dạng:

  • Chuyển ký tự ở đầu xâu \(S\) xuống cuối xâu
  • Chuyển ký tự ở cuối xâu \(S\) lên đầu xâu

Hãy tìm cách dùng ít phép biến đổi nhất để biến xâu \(S\) thành một dãy dấu ngoặc hợp lệ.

Input

  • Xâu \(S\) gồm không quá \(10^6\) ký tự \(\in \{(,)\}\)

Output

  • Ghi ra một số nguyên duy nhất là số phép biến đổi cần sử dụng, nếu không có cách nào biến đổi xâu \(S\) thành dãy ngoặc hợp lệ, in ra số \(-1\)

Example

Test 1

Input
))()((() 
Output
2

Test 2

Input
())()(
Output
1

Test 3

Input
(()))) 
Output
-1

Test 4

Input
()()
Output
0

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.