Problem:
Score : 300 points

Problem Statement

There are N stones arranged in a row. Every stone is painted white or black.
A string S represents the color of the stones. The i-th stone from the left is white if the i-th character of S is ., and the stone is black if the character is #.

Takahashi wants to change the colors of some stones to black or white so that there will be no white stone immediately to the right of a black stone.
Find the minimum number of stones that needs to be recolored.

Constraints

1 \leq N \leq 2\times 10^5

S is a string of length N consisting of . and #.

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the minimum number of stones that needs to be recolored.

Sample Input 1

3
#.#

Sample Output 1

1

It is enough to change the color of the first stone to white.

Sample Input 2

5
#.##.

Sample Output 2

2

Sample Input 3

9
.........

Sample Output 3

0

Solution in OCaml (4.02.3) (judge verdict: Wrong Answer)

let solve n = 1

type mode = CSharp | FSharp

let _ =
  let n = Scanf.scanf "%d\n" (fun n -> n) in
  let ar = Array.make (n+1) '#' in
  let cnt = ref 0 in
  for i = 0 to n - 1 do
    Scanf.scanf (if i <> n-1 then "%c" else "%c\n") (fun c -> ar.(i) <- c)
  done;
  let left_sharp = ref 0 in
  let mode = ref CSharp in
  let tmp = ref 0 in
  for i = 0 to n - 1 do
    match !mode with
    | CSharp ->
       if ar.(i) = '#' && ar.(i + 1) = '.' then (left_sharp := !left_sharp + 1; mode := FSharp)
       else if ar.(i) = '#' then left_sharp := !left_sharp + 1
    | FSharp ->
       begin
         if i = n - 1 && ar.(i) = '.' then (tmp := !tmp + 1; cnt := !cnt + (min !tmp !left_sharp))
         else if i = n - 1 then cnt := !cnt + (min !tmp !left_sharp)
         else if ar.(i) = '.' then tmp := !tmp + 1
         else (cnt := !cnt + (min !tmp !left_sharp); left_sharp := 0; tmp := 0; mode := CSharp)
       end
  done;
  print_int !cnt