let bracket_match s =
  let n = String.length s in
  let stack = ref [] in
  let ok = ref true in
  let i = ref 0 in
  while !ok && !i < n do
    let c = s.[!i] in
    if c = '(' || c = '[' || c = '{' then
      stack := c :: !stack
    else if c = ')' || c = ']' || c = '}' then begin
      match !stack with
      | [] -> ok := false
      | top :: rest ->
        let pair =
          (c = ')' && top = '(') ||
          (c = ']' && top = '[') ||
          (c = '}' && top = '{')
        in
        if pair then stack := rest else ok := false
    end;
    i := !i + 1
  done;
  if !ok && !stack = [] then 1 else 0

;;

let strings = ["()"; "[{()}]"; "({[}])"; ""; "(("; "()[](){}"; "(a(b)c)"; "(()"; "])"] in
let count = ref 0 in
List.iter (fun s ->
  count := !count + bracket_match s
) strings;
!count
