class Fenwick_Tree: def __init__(self, N, A=None): self.N=N if A==None: self.data=[0]*N else: assert len(A)==N self.data=A self.__build() def __build(self): data=self.data for i in range(1, self.N+1): if i+(i&(-i))<=self.N: data[i+(i&(-i))-1]+=data[i-1] def add(self, i, x): i+=1 data=self.data while i<=self.N: data[i-1]+=x i+=i&(-i) def sum(self, i): S=0 data=self.data while i: S+=data[i-1] i-=i&(-i) return S def range_sum(self,l,r): return self.sum(r)-self.sum(l) def bisect_left(self, x, default=-1): i=0 k=1<>=1 return i if x else default def bisect_right(self, x, default=-1): i=0 k=1<>=1 return i if i=0: return self.Fenwick.bisect_left(self.Fenwick.sum(x), default) else: return default def next(self, x, mode=True, default=-1): """ S に含まれる x 以上の要素のうち, 最大値を求める. x: int mode: False のときは "以上" が "より大きい" になる. """ if not mode: x+=1 return self.Fenwick.bisect_right(self.Fenwick.sum(x), default) def less_count(self, x, mode=False): """ x 未満の元の個数を求める. x: int mode: mode=True ならば, "未満" が "以下" になる. """ if mode: x+=1 return self.Fenwick.sum(x) def more_count(self, x, mode=False): """ x より大きい元の個数を求める. x: int mode: mode=True ならば, "より大きい" が "以上" になる. """ return len(self)-self.less_count(x, not mode) def kth_min(self, k, default=-1): """ k 番目に小さい元を求める. """ if 1<=k<=len(self): return self[k-1] else: return default def kth_max(self, k, default=-1): """ k 番目に大きい元を求める. """ if 1<=k<=len(self): return self[~(k-1)] else: return default #================================================== from string import ascii_uppercase as X N=int(input()) S=list(map(lambda x:ord(x)-ord("A"),input())) E=[0]*26 for s in S: E[s]+=1 a=X.index("A"); g=X.index("G"); c=X.index("C"); t=X.index("T") M=Ordered_Set(N,S=[1]*N) ans=0 alpha=0 while E[a]+E[g]+E[c]+E[t]: ans+=1 c1=E[a]+E[g]+E[c]+E[t] i=M.kth_min(c1); M.discard(i) m=S[i]; E[m]-=1 c2=E[m] a=(a-c2)%26; g=(g-c2)%26; c=(c-c2)%26; t=(t-c2)%26 print(ans)