let rec is_match s i p j =
  if j = String.length p then i = String.length s
  else
    let first =
      i < String.length s
      && (p.[j] = '.' || p.[j] = s.[i])
    in
    if j + 1 < String.length p && p.[j + 1] = '*' then
      is_match s i p (j + 2)
      || (first && is_match s (i + 1) p j)
    else
      first && is_match s (i + 1) p (j + 1)

let count_match pats texts =
  let count = ref 0 in
  List.iter (fun p ->
    List.iter (fun t ->
      if is_match t 0 p 0 then count := !count + 1
    ) texts
  ) pats;
  !count

;;

let pats = [".a.b"; "a.*b"; "x*"; "a*b*c"] in
let texts = ["aabb"; "axb"; ""; "abcd"; "abc"; "aaabbbc"; "x"] in
count_match pats texts
