#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef map<int,int> mii;
typedef map<ll,ll> mll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll>   vl;
#define f(i,n)  for(i=0;i<n;i++)
#define f1(i,n)  for(i=1;i<n;i++)
#define fr(i,n) for(i=n-1;i>=0;i--)
#define em emplace_back
#define mp make_pair
#define in insert
#define fi first
#define sc second
#define b begin
#define e end
#define er erase
#define l length
#define c clear
#define si size
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);
const double pi=3.141592653;
const ll infi=1000000001;
const ll MOD=1000000007;
const ll mod=998244353;
const string no="NO\n",yes="YES\n";

// ll gcd(ll a,ll b){
//     if(a==0)    return b;
//     gcd(b%a,a);
// }

// void dfs(vl v[],ll node,ll hai[]){
//     hai[node]=1;
//     for(auto i:v[node]){
//         if(hai[i]==0){
//             dfs(v,i,hai);
//         }
//     }
// }

// ll con(vl v[],ll hai[],ll sz){
//     ll count=0;
//     for(int i=1;i<sz;i++){
//         if(hai[i]==0){
//             count++;
//             dfs(v,i,hai);
//         }
//     }
    // return count;
// }

// void gcde(int a,int b,int *x,int *y){
//     if(a==0){
//         *x=0;
//         *y=1;
//         return;
//     }    
//     int x1,y1;
//     gcde(b%a,a,&x1,&y1);
    
//     *x=y1-(b/a)*x1;
//     *y=x1;
// }


// ll recur(vl v,ll in,ll m,ll n){
//     if(in==-1)  return 1000000000001;
//     ll d,e,c;
//     d=max(m/v[in],n*v[in]);
//     c=recur(v,in-1,m/v[in],n*v[in]);
//     e=recur(v,in-1,m,n);
//     return min(c,min(e,d));
// }

// ll bexpo(ll a,ll p){
//     ll x=1;
//     while(p){
//     if(p&1){
//         x=(x*a)%mod;
//     }
//     a=(a*a)%mod;
//     p>>=1;
//     }
//     return x;
// }
// int dx[8]{-1,0,0,1,-1,-1,1,1};
// int dy[8]{0,-1,1,0,-1,1,-1,1};


int main() {
    fastio
    int t=1;
    // cin>>t;
    ll n,m,i,l,d,bank,k,j,x,y,ans,q;

    while(t--){ans=x=y=0;
        cin>>n;
        string s;
        cin>>s;
        f(i,n){
            x=y=0;
            for(int j=i;j<n;j++){
                if(s[j]=='A')    x++;
                else if(s[j]=='T') x--;
                else if(s[j]=='C')  y++;
                else y--;
                if(x==0 && y==0)    ans++;
            }
        }

        cout<<ans;
    }
    
    
	return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<set>
#include<cmath>
#include<iomanip>
#include<map>

using namespace std;

#define R (long long)(1e9 + 7)
#define M 998244353
#define INF 1e18L

struct dsu
{
	vector<int> rank, parent, c;
	vector<map<int, int>> f;
	int n;
	dsu(int n, vector<int>& c)
	{
		this -> n = n;
		this -> c = c;
		rank.assign(n, 0);
		parent.resize(n);
		f.resize(n);
		for(int i = 0; i < n; i++)
			parent[i] = i;
		for(int i = 0; i < n; i++)
			f[i][c[i]]++;
	}
	int find_set(int i)
	{
		if(i == parent[i])
			return i;
		return parent[i] = find_set(parent[i]);
	}
	bool is_same_set(int i, int j)
	{
		return (find_set(i) == find_set(j));
	}
	void union_set(int i, int j)
	{
		if(!is_same_set(i, j))
		{
			int u = find_set(i), v = find_set(j);
			if(rank[u] == rank[v])
			{
				rank[u]++;
				parent[v] = u;
				for(auto x : f[v])
				{
					f[u][x.first] += x.second;
				}
			}
			else if(rank[u] > rank[v])
			{
				parent[v] = u;
				for(auto x : f[v])
				{
					f[u][x.first] += x.second;
				}
			}
			else
			{
				parent[u] = v;
				for(auto x : f[u])
				{
					f[v][x.first] += x.second;
				}
			}
		}
	}

};
int main()
{
	int n, q;
	cin >> n >> q;
	vector<int> c(n);
	for(int& x : c)
		cin >> x;
	dsu d(n, c);
	while(q--)
	{
		int type;
		cin >> type;
		if(type == 1)
		{
			int a, b;
			cin >> a >> b;
			a--, b--;
			d.union_set(a, b);
		}
		else
		{
			int x, y;
			cin >> x >> y;
			x--;
			cout << d.f[d.find_set(x)][y] << '\n';

		}
	}
}
