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 Rust (1.15.1) (judge verdict: Wrong Answer)

use std::cmp::min;
use std::io::prelude::*;
use std::io::stdin;
use std::str::FromStr;

fn main() {
    let s = read::<String>().as_bytes().to_vec();

    let mut ran_length = vec![];

    let mut count = 1;
    for sub in s.windows(2) {
        if sub[0] != sub[1] {
            ran_length.push((count, sub[0]));
            count = 1;
        } else {
            count += 1;
        }
    }
    ran_length.push((count, *s.iter().last().unwrap()));

    println!(
        "{}",
        ran_length
            .iter()
            .map(|x| ((x.0 + 1) * x.0) / 2)
            .sum::<i32>()
            - ran_length
                .windows(2)
                .map(|sub| {
                    if sub[0].1 == b'<' && sub[1].1 == b'>' {
                        min(sub[0].0, sub[1].0)
                    } else {
                        0
                    }
                })
                .sum::<i32>()
    );
}

#[allow(dead_code)]
fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let token: String = stdin
        .lock()
        .bytes()
        .map(|b| b.unwrap() as char)
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().unwrap()
}