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 Rust (1.15.1) (judge verdict: Accepted)

use std::io::*;
use std::str::FromStr;

#[allow(unused_macros)]
macro_rules! scan {
  ($e:expr; $t:ty) => {
    $e.get::<$t>()
  };
  ($e:expr; $($t:ty), *) => {
    ($($e.get::<$t>(),)*)
  }
}

struct Scanner<R: Read> {
  reader: R
}

#[allow(dead_code)]
impl<R: Read> Scanner<R> {
  fn new(reader: R) -> Scanner<R> {
    Scanner { reader: reader }
  }
  fn safe_get<T: FromStr>(&mut self) -> Option<T> {
    let token = self.reader.by_ref().bytes().map(|c| c.unwrap() as char)
      .skip_while(|c| c.is_whitespace())
      .take_while(|c| !c.is_whitespace())
      .collect::<String>();
    if token.is_empty() { None } else { token.parse().ok() }
  }
  fn get<T: FromStr>(&mut self) -> T {
    if let Some(v) = self.safe_get() { v } else {
      writeln!(stderr(), "Terminated with EOF").unwrap();
      std::process::exit(0);
    }
  }
}

macro_rules! min {
  ($v1:expr, $v2:expr) => {
    if $v1 < $v2 { $v1 } else { $v2 }
  };
  ($v1:expr, $v2:expr, $($vals:expr), *) => {
    min!(min!($v1, $v2), $($vals), *)
  }
}

fn main() {
  let cin = stdin();
  let cin = cin.lock();
  let mut sc = Scanner::new(cin);
  let (_, s) = scan!(sc; i64, String);
  let mut ans = std::usize::MAX;
  if s.chars().all(|c| c == '.') || s.chars().all(|c| c == '#') {
    println!("0");
    return;
  }
  let mut wr = s.chars().filter(|&c| c == '.').collect::<String>().len();
  let bn     = s.chars().filter(|&c| c == '#').collect::<String>().len();
  let wn = wr;
  let mut bl = 0;
  for c in s.chars() {
    match c {
      '.' => wr -= 1,
      '#' => bl += 1,
      _   => {}
    }
    ans = min!(ans, bl + wr);
  }
  ans = min!(ans, wn, bn);
  println!("{}", ans);
}