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