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 C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>  // g++ -std=c++14 -o a a.cpp

using namespace std;

typedef pair<int, int> P;
typedef long long ll;

#define rep(i, n) for(int i = 0; i < (n); i++)
#define repto(i, n) for(int i = 0; i <= (n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007
#define DEBUG(x) cout << #x << ": " << x << endl;

int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};

__attribute__((constructor)) void initial() {
    cin.tie(0);
    ios::sync_with_stdio(false);
}

int leftB[200001] = {0};
int rightW[200001] = {0};

int main() {
    int N;
    string S;
    cin >> N >> S;

    ll sumB = 0;
    rep (i, N) { // カーソルの左隣の黒の数
        leftB[i] = sumB;
        if (S[i] == '#') sumB++;
    }

    ll sumW = 0;
    for (int i = N-1; i >= 0; i--) { // カーソルを含む右隣の白の数
        if (S[i] == '.') sumW++;
        rightW[i] = sumW;
    }

    ll minResult = INF;
    char preC = '@';
    bool hasIF = false;
    rep(i, N) {
        if(preC != '@' && S[i] != preC) {
            ll currentResult = leftB[i] + rightW[i];
            minResult = min(minResult, currentResult);
            hasIF = true;
        }
        preC = S[i];
    }
    if (!hasIF) minResult = 0; // 境界無しの場合
    cout << minResult << endl;
}