Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

var scanner = bufio.NewScanner(os.Stdin)

func nextInt() (int, error) {
	s, _ := nextString()
	return strconv.Atoi(s)
}

func nextString() (string, bool) {
	succeeded := scanner.Scan()
	if succeeded {
		return scanner.Text(), succeeded
	}
	return "", succeeded
}

func printArr(arr []string) {
	fmt.Println(strings.TrimRight(fmt.Sprintf("%+v", arr)[1:], "]"))
}

func main() {
	scanner.Split(bufio.ScanWords)

	const maxCapacity = 512 * 1024
	buf := make([]byte, maxCapacity)
	scanner.Buffer(buf, maxCapacity)

	n, _ := nextInt()
	if n == 1 {
		fmt.Println(0)
		return
	}

	s, succeeded := nextString()
	if !succeeded {
		fmt.Errorf("Scan failed")
		return
	}
	nOX := 0
	i := 1
	for {
		if s[i] != s[i-1] {
			nOX++
			i++
		}
		i++
		if i >= n {
			break
		}
	}
	fmt.Println(nOX)
}

C++: #include <cstdlib>
#include <iostream>

using namespace std;

enum stampState{
    EMPTY = 0,
    O = 1,
    X = 2,
};


int main(){
    int n;
    string s;
    bool isO[100000];
    int OXStamp = 0;
    stampState beforeStamp = EMPTY;

    cin >> n;
    cin >> s;

    for(int i=0; i<n; i++){
        if(s[i] == 'O'){
            isO[i] = true;
        }else{
            isO[i] = false;
        }
    }

    for(int i=0; i<n; i++){
        switch(beforeStamp){
            case EMPTY :
                if(isO[i]){
                    beforeStamp = O;
                }else{
                    beforeStamp = X;
                }
                break;
            case O :
                //cout << "Oyo" << endl;
                if(!isO[i]){
                    OXStamp++;
                    beforeStamp = EMPTY;
                }
                break;
            case X :
                //cout << "Xyo" << endl;
                if(isO[i]){
                    OXStamp++;
                    beforeStamp = EMPTY;
                }
                break;
        }
    }
    cout << OXStamp << endl;

    return 0;
}

C++: #include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

#define NUM 100005

int N;
char buf[NUM];

int main(){

	scanf("%d",&N);
	scanf("%s",buf);


	int ans = 0;

	for(int i = 0; i+1 < N;){

		if(buf[i] == 'O' && buf[i+1] == 'X'){
			ans++;
			i += 2;
		}else if(buf[i] == 'X' && buf[i+1] == 'O'){
			ans++;
			i += 2;
		}else{
			i++;
		}
	}

	printf("%d\n",ans);

	return 0;
}

C++: #include <cstdio>
#include <iostream>
#include <string>
using namespace std;

int n;
string S;

int main(void)
{
    cin >> n;
    cin >> S;

    int count = 0;
    for(int i=1;i<n;i++){
        if(S[i-1] != S[i]){
            count++;
            i++;
        }
    }

    cout << count << endl;
}

C++: #include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

int larger(int x, int y){
	if(x > y){
		return x;
	}
	else{
		return y;
	}
}

int main(){
	int N;
	string S;
	cin >> N >> S;
	int memo[N+1];
	for(int i = 0; i < N + 1; i++){
		memo[i] = 0;
	}
	for(int i = 1; i < N; i++){
		if(S[i] != S[i-1]){
			memo[i+1] = larger(memo[i-1]+1, memo[i]);
		}
		else{
			memo[i+1] = memo[i];
		}
	}
	cout << memo[N] << "\n";
}

C++: //0654 菅野美怜　未完成 //
#include<iostream>
#include<queue>
using namespace std;
int main(void){
  int N;
  int count = 0;
  char x;
  cin >> N;
  queue<char> data;
  
  for (int i = 0; i < N;i++){
    cin >> x;
    data.push(x);
  }

  //set<string> data2 = data;
  while(true)
  {
    if(data.front()=='O'){
      data.pop();
      if(data.front()=='X'){
        data.pop();
        count++;
      }
    }
      if(data.front()=='X'){
        data.pop();
        if(data.front()=='O'){
          data.pop();
          count++;
        }
      }
      if(data.size()==0){
      break;
    }
    
  }
  cout << count << endl;
  return 0;
}

C++: #include <iostream>
#include <string>

using namespace std;

int main() {
	int n; cin >> n;
	string s; cin >> s;
	int ans = 0;
	for (int i = 0; i < n - 1; ++i) {
		if (s[i] != s[i + 1]) { ans++; i++; }
	}
	cout << ans << endl;

	return 0;
}

C++: #include <iostream>
#include <string>

void solve() {
    int n;
    std::string s;
    std::cin >> n >> s;

    int i = 0, ans = 0;
    while (i + 1 < n) {
        if (s[i] != s[i + 1]) {
            ++ans;
            i += 2;
        } else {
            i += 1;
        }
    }

    std::cout << ans << "\n";
}

int main() {
    std::cin.tie(nullptr);
    std::ios::sync_with_stdio(false);

    solve();

    return 0;
}

C++: /*JOI 君はマルスタンプ，バツスタンプ，マルバツスタンプの3種類のスタンプをそれぞれ 0 個以上持っている．これらはマルやバツのマークを紙に印字することができるスタンプである．

   マルスタンプを使うとマルが 1 つ印字され，バツスタンプを使うとバツが 1 つ印字される．マルバツスタンプを使うとマルとバツが横一列に 1 つずつ印字され，スタンプの向きを変えることで，マルの右にバツが来るようにも，バツの右にマルが来るようにも印字できる．

   JOI 君は，持っているスタンプをそれぞれちょうど 1 回ずつ適当な順番で使い，紙に横一列にマルとバツを印字した．印字されたマルとバツの列は文字列 S で表される．S は O と X から構成された長さ N の文字列であり，Si= O ならば JOI 君が印字したマークのうち左から i 番目のものがマルであることを表し，Si= X ならばそれがバツであることを表す (1≦i≦N)．*/

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char const *argv[]) {
        int length, counter = 0;

        string ox;
        cin >> length >> ox;
        for(int i = 0; i < length; i++) {
                if(ox[i] == 'O' && ox[i+1] == 'X') {
                        counter++;
                        i++;
                }else if(ox[i] == 'X' && ox[i+1] == 'O') {
                        counter++;
                        i++;
                }
        }
        cout << counter << endl;
        return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
int main(){
    int N;
    int ans=0;
    string S;
    cin >> N;
    cin >> S;
    for(int i=0; i<N ; i++){
        if(S[i]=='O' && S[i+1]=='X' || S[i]=='X' && S[i+1]=='O'){
            ans++;
            i++;
        }
    }
    cout << ans << endl;
}

C++: #include<iostream>
#include<string>
#include<algorithm>	
#include<cmath>
using namespace std;
int main() {
	int n, b = 0, sum = 0, num = 0, ans = 0;
	char a; cin >> n;
	for(int h = 0; h < n; h++){
		cin >> a;
		if (a == 'O' && num == 1) {
			ans++; b++;
		}
		if (a == 'X' && sum == 1) {
			ans++; b++;
		}
		sum = 0; num = 0;
		if (a == 'O' && b == 0) {
			sum++;
		}
		if (a == 'X' && b == 0) {
			num++;
		}
		b = 0;
	}
	cout << ans << endl;
	cin >> n;
}

C++: #include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
//#pragma GCC optimize ("-O3")
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60;
template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }
//---------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------
　　　　　　　　　　　 ∧＿∧
　　　　　 ∧＿∧ 　（´<_｀ ）　 Welcome to My Coding Space!
　　　　 （ ´_ゝ`）　/　 ⌒i     @hamayanhamayan
　　　　／　　　＼　 　  |　|
　　　 /　　 /￣￣￣￣/　　|
　 ＿_(__ﾆつ/　    ＿/ .| .|＿＿＿＿
　 　　　＼/＿＿＿＿/　（u　⊃
---------------------------------------------------------------------------------------------------*/














int N; string S;
int dp[101010];
//---------------------------------------------------------------------------------------------------
void _main() {
	cin >> N >> S;
	rep(i, 0, N) {
		chmax(dp[i + 1], dp[i]);
		if (i + 1 < N and S[i] != S[i + 1]) chmax(dp[i + 2], dp[i] + 1);
	}
	cout << dp[N] << endl;
}