Language: C++

// ConsoleApplication1.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#include <iostream>
#include <vector>
int Height(std::vector<int> MtAndValley, int i);

int main()
{
	std::string input;
	std::cin >> input;
	std::vector<int> MtAndValley = std::vector<int>(input.length() + 1);
	std::vector<int> answers = std::vector<int>(input.length() + 1);
	std::vector<int> fixed = std::vector<int>(input.length() + 1);

	//TODO 折り返し点を決める 2:山<>  1:谷 >< 0:折り返しではない
	//RULE 最初と最後は折り返しとする
	for (size_t i = 0; i < input.length(); i++)
	{
		if (i == 0 ) {
			if (input[i] == '<') {
				MtAndValley[i] = 1;
				answers[i] = 0;
				fixed[i] = 1;
			}
			else {
				MtAndValley[i] = 2;
				answers[i] = 1;
				fixed[i] = 1;
			}
			continue;
		}
		if (i == input.length() - 1) {
			if (input[i - 1] == '<' && input[i] == '>') {
				MtAndValley[i] = 2;
			}
			if (input[i - 1] == '>' && input[i] == '<') {
				MtAndValley[i] = 1;
			}

			if (input[i] == '<') {
				MtAndValley[i+1] = 2;
				answers[i + 1] = 1;
				fixed[i + 1] = 1;
			}
			else {
				MtAndValley[i+1] = 1;
				answers[i + 1] = 0;
				fixed[i + 1] = 1;
			}
			continue;
		}

		if (input[i-1] == '<' && input[i] == '>') {
			MtAndValley[i] = 2;
		}
		if (input[i-1] == '>' && input[i] == '<') {
			MtAndValley[i] = 1;
		}

	}


	// " < > > "に対して
	//"1  2  0 1"になっている
	///TODO 2（山）のうち、直前or直後の折り返し地点まで最も遠いものを探す
	std::vector<int> Heights(MtAndValley.size());
	//山の高さ取得&山の頂点は答え確定にする
	//1（谷）は0で答え確定にする
	for (size_t i = 0; i < MtAndValley.size(); i++)
	{
		if (MtAndValley[i] == 1) {
			answers[i] = 0;
			fixed[i] = 1;
		}

		Heights[i] = Height(MtAndValley, i);
		if (Heights[i] != 0) {
			answers[i] = Heights[i];
			fixed[i] = 1;
		}
	}

	for (size_t i = 0; i < answers.size(); i++)
	{
		//0確定を見つけたら、左右に這っていって1ずつ増やしていく
		if (i > 0 && answers[i] == 0 && fixed[i] == 1) {
			//左
			int pos = i;
			while (true) {
				if (MtAndValley[--pos] != 2 &&fixed[pos] != 1) {
					answers[pos] = answers[pos + 1] + 1;
					fixed[pos] = 1;
				}
				else {
					break;
				}
			}

			pos = i;
			while (true) {
				if (pos < answers.size()-1 &&MtAndValley[++pos] != 2 && fixed[pos] != 1 ) {
					answers[pos] = answers[pos -1] + 1;
					fixed[pos] = 1;
				}
				else {
					break;
				}
			}
		}
	}


	//合計
	int answer = 0;
	for (size_t i = 0; i < answers.size(); i++)
	{
		answer += answers[i];
	}
	std::cout << answer;
	return 0;
}

//山の高さを求める
int Height(std::vector<int> MtAndValley, int i) {
	int rHeight = 0;
	int lHeight = 0;
	if (MtAndValley[i] != 2) {
		return 0x0;
	}
	///左右方向に1（谷）を探す
	//左
	for (int j = i; j >= 0; j--)
	{
		if (MtAndValley[j] == 1) {
			rHeight = i - j;
			break;
		}
		else { 
			continue;
		}
	}
	//右
	for (size_t j = i; j < MtAndValley.size(); j++)
	{
		if (MtAndValley[j] == 1) {
			lHeight = j - i;
			break;
		}
		else {
			continue;
		}
	}

	return __max(rHeight, lHeight);

}


// プログラムの実行: Ctrl + F5 または [デバッグ] > [デバッグなしで開始] メニュー
// プログラムのデバッグ: F5 または [デバッグ] > [デバッグの開始] メニュー

// 作業を開始するためのヒント: 
//    1. ソリューション エクスプローラー ウィンドウを使用してファイルを追加/管理します 
//   2. チーム エクスプローラー ウィンドウを使用してソース管理に接続します
//   3. 出力ウィンドウを使用して、ビルド出力とその他のメッセージを表示します
//   4. エラー一覧ウィンドウを使用してエラーを表示します
//   5. [プロジェクト] > [新しい項目の追加] と移動して新しいコード ファイルを作成するか、[プロジェクト] > [既存の項目の追加] と移動して既存のコード ファイルをプロジェクトに追加します
//   6. 後ほどこのプロジェクトを再び開く場合、[ファイル] > [開く] > [プロジェクト] と移動して .sln ファイルを選択します

Compiler output:
a.cc: In function 'int Height(std::vector<int>, int)':
a.cc:155:16: error: '__max' was not declared in this scope
  155 |         return __max(rHeight, lHeight);
      |                ^~~~~