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"

using namespace std;

#define int long long
#define ll long long
typedef pair<int, int> P;
#define mod 1000000007
#define INF (1LL<<60)

#define rep(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define YES cout << "YES" << endl
#define Yes cout << "Yes" << endl
#define NO cout << "NO" << endl
#define No cout << "No" << endl


signed main(){

	int N;
	cin >> N;
	string S;
	cin >> S;

	int sum_white[223456], sum_black[223456];
	rep(i, N + 1){
		sum_white[i] = sum_black[i] = 0;
	}
	rep(i, N + 1){
		sum_white[i + 1] = sum_white[i] + (S[i] == '.' ? 1 : 0);
		sum_black[i + 1] = sum_black[i] + (S[i] == '#' ? 1 : 0);
	}

	int ans = INF;
	rep(i, N+1){
		ans = min(ans, sum_black[i + 1] - sum_black[0]
			+ sum_white[N + 1] - sum_white[i + 1]);
	}

	if (sum_black[N + 1] == N)
		cout << 0 << endl;
	else
		cout << ans << endl;
	
	return 0;
}