#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300005,p=998244353;
int read(){
	int f=1,g=0;
	char ch=getchar();
	for (;!isdigit(ch);ch=getchar()) if (ch=='-') f=-1;
	for (;isdigit(ch);ch=getchar()) g=g*10+ch-'0';
	return f*g;
}
int qpow(int x,int k){
	int t=1;
	for (;k;k>>=1){
		if (k&1) t=(ll)t*x%p;
		x=(ll)x*x%p;
	}
	return t;
}
struct state{
	int a[6];
	int &operator[](int i){return a[i];}
	state(){memset(a,0,sizeof(a));}
}x,rx,s[N][2],c,e;
bool operator==(state a,state b){
	for (int i=0;i<6;i++)
	if (a[i]==b[i]) return false;
	return true;
}
bool operator<(state a,state b){
	for (int i=0;i<6;i++)
	if (a[i]!=b[i]) return a[i]<b[i];
	return false;
}
state operator*(state x,state y){for (int i=0;i<6;i++) x[i]=(ll)x[i]*y[i]%p;return x;}
state operator+(state x,state y){for (int i=0;i<6;i++) if((x[i]+=y[i])>=p) x[i]-=p;return x;}
state operator-(state x,state y){for (int i=0;i<6;i++) if((x[i]-=y[i])<0) x[i]+=p;return x;}
state operator+(state x,int k){for (int i=0;i<6;i++) if ((x[i]+=k)>=p) x[i]-=p;return x;}
state operator-(state x,int k){for (int i=0;i<6;i++) if ((x[i]-=k)<0) x[i]+=p;return x;}
state getval(state *a,state x){
	state cur=a[0]+a[1]*x;
	return cur;
}
int n,m;
ll ans;
char ch[N];
map<state,int> f;
int main(){
	for (int i=0;i<6;i++) x[i]=i+1,rx[i]=qpow(x[i],p-2);
	n=read();
	scanf(" %s",ch+1);
	for (int i=0;i<6;i++) s[n+1][1][i]=1;
	for (int i=n;i;i--)
	if (ch[i]=='+'){s[i][0]=s[i+1][0]+s[i+1][1];s[i][1]=s[i+1][1];c=c-1;}
	else if (ch[i]=='-'){s[i][0]=s[i+1][0]-s[i+1][1];s[i][1]=s[i+1][1];c=c+1;}
	else if (ch[i]=='>'){s[i][0]=s[i+1][0];s[i][1]=s[i+1][1]*x;c=c*rx;}
	else if (ch[i]=='<'){s[i][0]=s[i+1][0];s[i][1]=s[i+1][1]*rx;c=c*x;}
	for (int i=n;i;i--){
		f[getval(s[i+1],e)]++;
		ans+=f[getval(s[i],c)];
	}
	printf("%lld\n",ans);
	return 0;
}