Problem:
Score : 1200 points

Problem Statement

In Takahashi's mind, there is always an integer sequence of length 2 \times 10^9 + 1: A = (A_{-10^9}, A_{-10^9 + 1}, ..., A_{10^9 - 1}, A_{10^9}) and an integer P.

Initially, all the elements in the sequence A in Takahashi's mind are 0, and the value of the integer P is 0.

When Takahashi eats symbols +, -, > and <, the sequence A and the integer P will change as follows:

When he eats +, the value of A_P increases by 1;

When he eats -, the value of A_P decreases by 1;

When he eats >, the value of P increases by 1;

When he eats <, the value of P decreases by 1.

Takahashi has a string S of length N. Each character in S is one of the symbols +, -, > and <.
He chose a pair of integers (i, j) such that 1 \leq i \leq j \leq N and ate the symbols that are the i-th, (i+1)-th, ..., j-th characters in S, in this order.
We heard that, after he finished eating, the sequence A became the same as if he had eaten all the symbols in S from first to last.
How many such possible pairs (i, j) are there?

Constraints

1 \leq N \leq 250000

|S| = N

Each character in S is +, -, > or <.

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the answer.

Sample Input 1

5
+>+<-

Sample Output 1

3

If Takahashi eats all the symbols in S, A_1 = 1 and all other elements would be 0.
The pairs (i, j) that leads to the same sequence A are as follows:

(1, 5)

(2, 3)

(2, 4)

Sample Input 2

5
+>+-<

Sample Output 2

5

Note that the value of P may be different from the value when Takahashi eats all the symbols in S.

Sample Input 3

48
-+><<><><><>>>+-<<>->>><<><<-+<>><+<<>+><-+->><<

Sample Output 3

475

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

#include<bits/stdc++.h>
typedef long long ll;
const int N=250005,mo1=998244853,mo2=993244853;
struct pii{
	int x,y;
	inline void operator+=(const pii&rhs){x+=rhs.x-mo1;y+=rhs.y-mo2;x+=x>>31&mo1;y+=y>>31&mo2;}
	inline void operator-=(const pii&rhs){x-=rhs.x;y-=rhs.y;x+=x>>31&mo1;y+=y>>31&mo2;}
	inline pii operator*(const pii&rhs)const{return (pii){int(1ll*x*rhs.x%mo1),int(1ll*y*rhs.y%mo2)};}
	inline operator ll(){return (ll(x)<<30)|y;}
}f[N],mi[N*2],t,nw;
int n,i,p,pp[N];
char c[N];
std::unordered_map<ll,int>mp;
ll ans;
int main(){
	mi[0]=(pii){487619673,250267803};for(i=1;i<N*2;++i)mi[i]=mi[i-1]*(pii){789322,989432};
	scanf("%d%s",&n,c+1);
	for(i=1;i<=n;++i){
		if(c[i]=='+')nw+=mi[p+N];
		if(c[i]=='-')nw-=mi[p+N];
		if(c[i]=='>')++p;
		if(c[i]=='<')--p;f[i]=nw;pp[i]=p;
	}
	++mp[f[n]];
	for(i=1;i<=n;++i)ans+=mp[t=f[i]],t+=f[n]*mi[pp[i]+N],++mp[t];
	printf("%lld\n",ans);
	return 0;
}