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.42.0) (judge verdict: Accepted)

#![allow(non_snake_case)]
#![allow(unused_imports)]
use proconio::input;
use std::cmp::max;
use std::cmp::min;
use std::collections::HashMap;
use std::collections::VecDeque;

fn main() {
    input! {
        N: usize,
        S: String,
    }

    // "#." はダメ
    // "##" ".#" ".." OK
    // 最終形は "#####" "......." "......######"
    // 一色にするのは簡単に計算できる。 "......#####"は?
    // どこを区切れ目にするかN通り * 個数カウント
    // 個数カウントをO(1)でやる → 累積和

    let whites: usize = S.chars().filter(|&c| c == '.').count();
    let blacks: usize = S.chars().filter(|&c| c == '#').count();
    let mut ans = min(whites, blacks);

    // 累積和を使う
    let mut white_acc: Vec<usize> = vec![0; N + 1];
    let mut black_acc: Vec<usize> = vec![0; N + 1];
    for i in 0..N {
        if &S[i..=i] == "#" {
            white_acc[i + 1] = white_acc[i];
            black_acc[i + 1] = black_acc[i] + 1;
        } else {
            white_acc[i + 1] = white_acc[i] + 1;
            black_acc[i + 1] = black_acc[i];
        }
    }

    // どこを黒の最初にするか?
    for i in 1..N {
        // [0 ~ i) までの黒石を白くする
        // [i ~ N) までの白石を黒くする
        let cand = black_acc[i] + (white_acc[N] - white_acc[i]);
        ans = min(ans, cand);
    }

    println!("{}", ans);
}