Problem:
Score : 300 points

Problem Statement

Given is a string S of length N-1.
Each character in S is < or >.

A sequence of N non-negative integers, a_1,a_2,\cdots,a_N, is said to be good when the following condition is satisfied for all i (1 \leq i \leq N-1):

If S_i= <: a_i<a_{i+1}

If S_i= >: a_i>a_{i+1}

Find the minimum possible sum of the elements of a good sequence of N non-negative integers.

Constraints

2 \leq N \leq 5 \times 10^5

S is a string of length N-1 consisting of < and >.

Input

Input is given from Standard Input in the following format:

S

Output

Find the minimum possible sum of the elements of a good sequence of N non-negative integers.

Sample Input 1

<>>

Sample Output 1

3

a=(0,2,1,0) is a good sequence whose sum is 3.
There is no good sequence whose sum is less than 3.

Sample Input 2

<>>><<><<<<<>>><

Sample Output 2

28

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

//============================================================================
// Name        : filename.cpp
// Author      : abb
// Version     :
// Copyright   : [My copyright notice]
// Description : test program
//============================================================================

/*
A - ><

実行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 300 点

問題文
長さ N-1 の文字列 S が与えられます．
S の各文字は '<' または '>' です．
長さ N の非負整数列 a_1, a_2, \cdots, a_N は，
すべての i (1 <= i <= N-1) について次の条件をみたす時，良い非負整数列と呼ばれます．

・S_i= '<' のとき： a_i<a_{i+1}
・S_i= '>' のとき： a_i>a_{i+1}

良い非負整数列の要素の総和としてありうる最小の値を求めてください．

制約

・2 <= N <= 5 × 10^5
・S は '<' と '>' のみから成る長さ N-1 の文字列．
 */

#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ull = unsigned long long;

#define REP(i, m, n) for (int i = m; i < (int)(n); ++(i))
#define ALL(x) begin(x), end(x)

ll calc(int dec_count, int inc_count, int previous_section_last_height)
{
    // dec = 1 なら 1, dec = 2 なら 1 + 2, ...
    ll sum_tmp = (dec_count * (dec_count + 1)) / 2 + (inc_count * (inc_count + 1)) / 2 - dec_count;
    // 前のセクションとの境界はダブっているので考える (大きい方を採用)
    // → もし dec_count のほうが大きいなら previous_section_last_height との差分を足す
    if (dec_count > previous_section_last_height)
    {
        sum_tmp += dec_count - previous_section_last_height;
    }
    return sum_tmp;
}

/**
 * エントリポイント．
 * 最小になるところで 0 になればよい．
 * つまり， >>><<< のように 「下り→上り」でワンセットに考え，ここの部分の部分和を考えて
 * それを全部足せばよい．ただし境界部は注意．
 * 前の境界部が小さすぎると，これ以上下れないという状況が発生するので，その時は補正する．
 * @return 0.
 */
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    const char inc = '<';
    const char dec = '>';

    string s;
    cin >> s;
    ll sum_all = 0;
    int previous_section_last_height = 0;
    char last_sign = inc; // ループの前の段階の記号
    bool first = true;
    int dec_count = 0; // セクション内で下った回数
    int inc_count = 0; // セクション内で登った回数
    for (char c : s)
    {
        if (first)
        {
            // 新たなシーケンスの始まり
            first = false;
            if (c == dec)
            {
                // cerr << c << "新たなシーケンスの始まり (減少開始)" << endl;
                ++dec_count;
            }
            else
            {
                // cerr << c << "新たなシーケンスの始まり (増加開始)" << endl;
                ++inc_count;
            }
        }
        else if (last_sign == inc && c == dec)
        {
            // 新たなシーケンスの始まり
            // cerr << c << "新たなシーケンスの始まり (増加から減少に転じる)" << endl;
            // TODO: 前のシーケンスの精算
            ll sum_tmp = calc(dec_count, inc_count, previous_section_last_height);
            sum_all += sum_tmp;
            previous_section_last_height = inc_count;
            dec_count = 1;
            inc_count = 0;
        }
        else if (last_sign == inc)
        { // c == inc
            // 増加途中
            // cerr << c << "増加途中" << endl;
            ++inc_count;
        }
        else if (c == dec)
        { // last_sign == dec
            // 減少途中
            // cerr << c << "減少途中" << endl;
            ++dec_count;
        }
        else
        { // last_sign == dec && c == inc
            // 減少から増加に転じる
            // cerr << c << "減少から増加に転じる" << endl;
            ++inc_count;
        }
        last_sign = c;
    }
    if (dec_count != 0 || inc_count != 0)
    {
        ll sum_tmp = calc(dec_count, inc_count, previous_section_last_height);
        sum_all += sum_tmp;
    }
    cout << sum_all << endl;
    return 0;
}