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 (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define ll long long
#define rep(i,n) for(ll i=0;i<(n);i++)
#define max(p,q) ((p)>(q)?(p):(q))
#define min(p,q) ((p)<(q)?(p):(q))
#define chmax(a,b) ((a)=(a)>(b)?(a):(b))
#define chmin(a,b) ((a)=(a)<(b)?(a):(b))
#define abs(p) ((p)>=(0)?(p):(-(p)))
#define MOD 1000000007
ll power(ll a,ll b){ll r=1;rep(i,b){r*=a;}return r;}
#define swap(a,b) do{ll w=(a);(a)=(b);(b)=w;}while(0)

//your code here!

int main(void){
    char S[500100];
    scanf("%s", S);

    //例外
    ll t1=0, t2=0, j=0;
    while(S[j]!='\0' && S[j]=='>') {t1++; j++;}
    while(S[j]!='\0' && S[j]=='<') {t2++; j++;}
    if(S[j]=='\0') {
        printf("%lld\n", t1*(t1+1)/2 + t2*(t2+1)/2);
        return 0;
    }

    ll i=0, ans1=0, ans2=0, ans=0;
    if(S[i]=='>') while(S[i++]=='>') ans1++;
    ans += ans1*(ans1+1)/2;
    ans1=0;

    while(S[i]!='\0') {
        if(S[i]=='<') ans1++;
        else          ans2++;

        if(S[i]=='>' && S[i+1]=='<') {
            ll MM=max(ans1, ans2), mm=ans1+ans2-MM-1;
            ans1=ans2=0;
            ans += MM*(MM+1)/2 + mm*(mm+1)/2;
        }

        i++;
    }

    ll MM=max(ans1, ans2), mm=ans1+ans2-MM-1;
    ans1=ans2=0;
    ans += MM*(MM+1)/2 + mm*(mm+1)/2;

    printf("%lld\n", ans);
    return 0;
}