Problem:
マルバツスタンプ (Circle Cross Stamps)
問題文
JOI 君はマルスタンプ，バツスタンプ，マルバツスタンプの3種類のスタンプをそれぞれ
0
個以上持っている．これらはマルやバツのマークを紙に印字することができるスタンプである．
マルスタンプを使うとマルが
1
つ印字され，バツスタンプを使うとバツが
1
つ印字される．マルバツスタンプを使うとマルとバツが横一列に
1
つずつ印字され，スタンプの向きを変えることで，マルの右にバツが来るようにも，バツの右にマルが来るようにも印字できる．
JOI 君は，持っているスタンプをそれぞれちょうど
1
回ずつ適当な順番で使い，紙に横一列にマルとバツを印字した．印字されたマルとバツの列は文字列
S
で表される．
S
は
O
と
X
から構成された長さ
N
の文字列であり，
S_i =
O
ならば JOI 君が印字したマークのうち左から
i
番目のものがマルであることを表し，
S_i =
X
ならばそれがバツであることを表す (
1 ≦ i ≦ N
)．
あなたは，JOI 君が持っているスタンプの個数は分からないが，JOI 君が印字したマルとバツの列は知っている．印字されたマルとバツの列から，JOI 君が持っているマルバツスタンプの個数としてあり得るもののうち最大値を求めよ．
制約
1 ≦ N ≦ 100000 (= 10^5)
S
は長さ
N
の文字列である．
S
の各文字は
O
か
X
である．
入力・出力
入力
入力は以下の形式で標準入力から与えられる．
N
S
出力
JOI 君が持っているマルバツスタンプの個数としてあり得るもののうち最大値を出力せよ．
入出力例
入力例 1
5
OXXOX
出力例 1
2
JOI 君が印字したマークは，左から順に，マル，バツ，バツ，マル，バツである．JOI 君がマルスタンプ，バツスタンプ，マルバツスタンプをそれぞれ
0, 1, 2
個持っているとすると，以下の順番でスタンプを使えば，そのようにマークを印字することができる．
1
つ目のマルバツスタンプを使ってマルとバツをこの順に印字する．
この右に，
2
つ目のマルバツスタンプを使ってバツとマルをこの順に印字する．
最後に，この右に，バツスタンプを使ってバツを印字する．
マルバツスタンプを
3
個以上持っているケースは考えられないので，
2
を出力する．
入力例 2
14
OXOXOXOXXOXOXO
出力例 2
7
入力例 3
10
OOOOOOOOOO
出力例 3
0
情報オリンピック日本委員会作 『第 18 回日本情報オリンピック JOI 2018/2019 予選競技課題』

Submitted solutions:

code_snippet: #include<iostream>
using namespace std;
int main() {
	int n;
	string s;
	int cnt = 0;
	cin >> n >> s;
	for (int i = 0; i < n; i++)
		if (s.substr(i, 2) == "OX" || s.substr(i, 2) == "XO")
			cnt++, i++;
	cout << cnt << endl;
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3336
final_rank: 2

code_snippet: #include<iostream>
using namespace std;
int main() {

	int n;
	string s;
	int cnt = 0;

	cin >> n >> s;
	for (int i = 0; i < n; i++)
	{
		if (s.substr(i, 2) == "OX" || s.substr(i, 2) == "XO")
			cnt++, i++;
	}
	cout << cnt << endl;

	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3336
final_rank: 2

code_snippet: #include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int n, count;
    char ch[100000];
    count = 0;
    scanf("%d",&n);
    for(int i = 0; i < n; i++){
        scanf("%s", ch);
    }
    
    int i = 0;
    while(i < n-1){
        if(ch[i] == 'O'){
            if(ch[i+1] == 'X'){
                count++;
                i += 2;
            }
            else i++;
        }
        if(ch[i] == 'X'){
            if(ch[i+1] == 'O'){
                count++;
                i += 2;
            }
            else i++;
        }
        
    }
    printf("%d\n", count);
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3320
final_rank: 1

code_snippet: #include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <random>


int max(const std::vector<int>& temp_vec) {
	int temp_max = 0;

	for (const auto& temp : temp_vec) {
		if (temp_max < temp) { temp_max = temp; };
	}

	return temp_max;
};

int getNumStumpMax(std::string& vec) {

	std::vector<int> temp_sizes;
	for (int i = 0; i < 100000; i++) {
		std::vector<int> results;

		std::string marubatsu = "OX";
		std::string batsumaru = "XO";
		int subStrSize1 = marubatsu.size();
		int subStrSize2 = batsumaru.size();
		int pos1 = vec.find(marubatsu);
		int pos2 = vec.find(batsumaru);
		auto vec_ = vec;
		while (pos1 != std::string::npos && pos2 != std::string::npos) {
			double rand_n = ((double)rand() + 0.5) / (RAND_MAX + 1.0);
			if (rand_n < 0.5) {
				results.push_back(pos1);
				auto pos1_ = pos1;
				vec_.replace(pos1_, 2, "**");
				pos1 = vec_.find(marubatsu);
				pos2 = vec_.find(batsumaru);
			}
			else {
				results.push_back(pos2);
				auto pos2_ = pos2;
				vec_.replace(pos2_, 2, "**");
				pos1 = vec_.find(marubatsu);
				pos2 = vec_.find(batsumaru);
			}
			
		}
		temp_sizes.emplace_back(results.size());
	}
	int ret = max(temp_sizes);

	return ret;
}


int main() {

	int N;
	std::cin >> N;
	std::string vec_string;
	std::cin >> vec_string;

	auto num_max = getNumStumpMax(vec_string);
	std::cout << num_max << std::endl;

	return 0;
}
accuracy: 0.018867924528301886
time_ms: 40
memory_kb: 3536
final_rank: 7

code_snippet: #include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <random>


int max(const std::vector<int>& temp_vec) {
	int temp_max = 0;

	for (const auto& temp : temp_vec) {
		if (temp_max < temp) { temp_max = temp; };
	}

	return temp_max;
};

int getNumStumpMax(std::string& vec) {

	std::vector<int> temp_sizes;
	for (int i = 0; i < 100000; i++) {
		std::vector<int> results;

		std::string marubatsu = "OX";
		std::string batsumaru = "XO";
		int subStrSize1 = marubatsu.size();
		int subStrSize2 = batsumaru.size();
		int pos1 = vec.find(marubatsu);
		int pos2 = vec.find(batsumaru);
		auto vec_ = vec;
		while (pos1 != std::string::npos && pos2 != std::string::npos) {
			double rand_n = ((double)rand() + 0.5) / (RAND_MAX + 1.0);
			if (rand_n < 0.5 && pos1 !=-1) {
				results.push_back(pos1);
				auto pos1_ = pos1;
				vec_.replace(pos1_, 2, "**");
				pos1 = vec_.find(marubatsu);
				pos2 = vec_.find(batsumaru);
			}
			else if(pos2 !=-1){
				results.push_back(pos2);
				auto pos2_ = pos2;
				vec_.replace(pos2_, 2, "**");
				pos1 = vec_.find(marubatsu);
				pos2 = vec_.find(batsumaru);
			}
			
		}
		temp_sizes.emplace_back(results.size());
	}
	int ret = max(temp_sizes);

	return ret;
}


int main() {

	int N;
	std::cin >> N;
	std::string vec_string;
	std::cin >> vec_string;

	auto num_max = getNumStumpMax(vec_string);
	std::cout << num_max << std::endl;

	return 0;
}
accuracy: 0.018867924528301886
time_ms: 40
memory_kb: 3448
final_rank: 6

code_snippet: #include <bits/stdc++.h>

using namespace std;

int main() {
  int n;
  cin >> n;
  string s;
  cin >> s;

  int ans = 0;
  for (int i = 0; i < n; i++) {
    if (i + 1 >= n) continue;
    string t = "";
    t += s[i], t += s[i + 1];
    if (t == "OX" || t == "XO") {
      ans++;
      i++;
    }
  }
  cout << ans << endl;

  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3340
final_rank: 4

code_snippet: #include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define REP(i,n) for (ll i = 0; i < (n); ++i)

int main(){
    ll n;
    cin >> n;
    string s;
    cin >> s;
    ll i;
    ll ans = 0;
    for(i = 0; i < n;){
        if(i < n - 1 &&
           (s.substr(i, 2) == "OX" || s.substr(i, 2) == "XO")){
            ans++;
            i += 2;
        }else{
            i++;
        }
    }
    cout << ans << endl;
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3348
final_rank: 5