#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<ll,ll> pii;
typedef vector<pii> vpii;

#define pb(x) push_back(x)
#define ppb() pop_back()
#define mp(x,y) make_pair(x,y)
#define mod 1000000007
#define FOR0(i,n) for(ll i=0;i<n;i++)
#define FOR(i,a,b) for(ll i = a; i < b; i++)
#define FORD(i,a,b) for(ll i=(a);i>=(int)(b);i--)
#define sf(n) scanf("%lld", &n)
#define sfc(x) scanf("%c", &x)
#define pf(x) printf("%lld", x)
#define pff(x) printf("%lf", x)
#define pfc(x) printf("%c", x)
#define pfs(x) printf("%s", x)
#define sf2(a,b) scanf("%lld %lld", &a, &b)
#define sf3(a,b,c) scanf("%lld %lld %lld", &a, &b, &c)
#define pfn(n) printf("%lld\n", n)
#define pfs(n) printf("%lld ", n)
#define ff first
#define ss second
#define mem(a,b) memset(a,b,sizeof(a))
#define sz size()
#define ll long long
#define all(c) (c).begin(),(c).end()
#define fast ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
const ll INF = 2e18;

// bool prime[100009];
// unordered_map<ll,ll> largest_factor;
// void SieveOfEratosthenes(ll n)
// {
//     memset(prime,true, sizeof(prime));

//     for (ll p=2; p*p<=n; p++)
//     {
//         if (prime[p] == true)
//         {
//             for (ll i=p*p; i<=n; i += p){
//                 prime[i] = false;
//                 largest_factor[i]=p;
//             }

//         }
//     }
// }


ll power(ll x,ll y)
{
    if (y == 0)
        return 1;
    else if (y%2 == 0)
        return power(x, y/2)*power(x, y/2);
    else
        return x*power(x, y/2)*power(x, y/2);
}

// ll power1(ll a,ll b){
//     ll res=1;
//     while(b){
//         if(b&1){
//             res*=a;
//         }
//         a=a*a;
//         b>>=1;
//     }
//     return res;
// }



ll mod_power(ll a,ll b,ll m){
    ll res=1;
    a%=m;
    while(b){
        if(b&1){
            res=res*a%m;
        }
        a=a*a%m;
        b>>=1;
    }
    return res;
}
// ll printDivisors(ll n)
// {
//     ll count=0;
//     for (ll i=1; i<=sqrt(n); i++)
//     {
//         if (n%i == 0)
//         {
//             if (n/i == i)
//                 count++;

//             else // Otherwise print both
//                 printf("%d %d ", i, n/i);
//         }
//     }
// }

// bool isPrime(int n)
// {
//     if (n <= 1)  return false;
//     if (n <= 3)  return true;

//     if (n%2 == 0 || n%3 == 0) return false;

//     for (int i=5; i*i<=n; i=i+6)
//         if (n%i == 0 || n%(i+2) == 0)
//            return false;

//     return true;
// }
// ll par[1000001];
// ll ranki[1000001]={0};

// ll find(ll x){
//     if(par[x]!=x){
//         par[x] = find(par[x]);
//     }
//     return par[x];
// }


// void unionset(ll x,ll y){
//     ll xr = find(x);
//     ll yr = find(y);
//     if(ranki[xr]>ranki[yr]){
//         par[yr]=xr;
//     }
//     else if(ranki[xr]<ranki[yr]){
//         par[xr]=yr;
//     }
//     else{
//         par[yr] = xr;
//         ranki[xr]++;
//     }
// }

// vector<pii> v[10001];
// ll vis[10001]={0};
//  ll dis[10001];
// void dijkstra(){
//     FOR0(i,10001)dis[i]=1e18;
//     multiset<pii > s;
//     s.insert({0,1});
//     dis[1]=0;
//     while(!s.empty()){
//         pii up = *s.begin();
//         ll u=up.ss;
//         s.erase(s.begin());
//         if(vis[u])continue;
//         vis[u]=1;
//         FOR0(i,v[u].size()){
//             ll e = v[u][i].ff,w=v[u][i].ss;
//             if(dis[u]+w<dis[e]){
//                 dis[e]=dis[u]+w;
//                 s.insert({dis[e],e});
//             }
//         }
//     }

// }

// void dijkstra(ll s){
//         FOR0(i,10001)dis[i]=INF;
//         dis[s] = 0;
//         priority_queue<pii , vpii , greater<pii >> pq;
//         pq.push({0, s});
//         while(!pq.empty())
//         {
//             int u = pq.top().ss;
//             //int d = pq.top().first;
//             pq.pop();
//             if(vis[u]) continue;
//             vis[u] = 1;
//             for(auto it: v[u])
//             {
//                 int e = it.ff;
//                 int w = it.ss;
//                 if(dis[u] + w < dis[e])
//                 {
//                     dis[e] = dis[u] + w;
//                     pq.push({dis[e], e});
//                 }
//             }
//         }
// }


// void dfs1(ll s,ll count){
//     vis[s]=1;
//     //val[s]=count;
//     FOR0(i,v[s].size()){
//         if(!vis[v[s][i]]){
//             dfs1(v[s][i],count);
//         }
//     }
// }

// void dfs(ll s){
//     stack<ll> st;
//     st.push(s);
//     vis[s]=1;
//     while(!st.empty()){
//         ll u = st.top();
//         st.pop();
//         FOR0(i,v[u].size()){
//             if(!vis[v[u][i]]){
//                 st.push(v[u][i]);
//                 vis[v[u][i]]=1;
//             }
//         }
//     }
// }

// void dfs(ll s){
//     queue<ll> q;
//     q.push(s);
//     vis[s]=1;
//     while(!q.empty()){
//         ll u = q.front();
//         q.pop();
//         FOR0(i,v[u].size()){
//             if(!vis[v[u][i]]){
//                 q.push(v[u][i]);
//                 vis[v[u][i]]=1;
//             }
//         }
//     }
// }

// ll bs(){
//     ll l,h,mid;
//     while(l<=h){
//         mid = (l+h)/2;
//         if(a[mid]==x)return mid;
//         else if(x>a[mid]){
//             l = mid+1;
//         }
//         else if(x<a[mid]){
//             h = mid-1;
//         }
//     }
// }

// ll lbs(){
//     ll l,h,mid;
//     while(l<h){
//         mid = (l+h)/2;
//         if(x<=a[mid]){
//             h = mid;
//         }
//         else{
//             l = mid+1;
//         }
//     }
//     if(a[l]==x)return l;
//     else return -1;
// }


// ll ubs(){
//     ll l,h,mid;
//     while(l<h){
//         mid = (l+h)/2;
//         if(a[mid]<=x)l = mid;
//         else{
//             h = mid-1;
//         }
//     }
//     if(a[h]==x)return h;
//     else return -1;
//    }


//ll min(ll a,ll b){
  //  if(a<b)return a;
  //  else return b;
//}

// ll d,x,y;

// void extendedEuclid(ll a,ll b){
//     if(b==0){
//         d = a;
//         x = 1;
//         y = 0;
//     }
//     else{
//         extendedEuclid(b,a%b);
//         ll temp = x;
//         x = y;
//         y = temp - (a/b)*y;
//     }
// }


bool compare(pair<ll,string> a,pair<ll,string> b)
{
    if(a.first==b.first)
        return (a.second < b.second);
    else
        return (a.first>b.first);
}
// ll a[100001],n;
// ll tree[500000];

// void build(ll node, ll start, ll end)
// {
//     if(start == end)
//     {
//         tree[node] = A[start];
//     }
//     else
//     {
//         ll mid = (start + end) / 2;
//         build(2*node+1, start, mid);
//         build(2*node+2, mid+1, end);
//         tree[node] = tree[2*node+1] + tree[2*node+2];
//     }
// }
// ll query(ll node, ll start, ll end, int l, int r)
// {
//     if(r < start or end < l)
//     {
//         return 0;
//     }
//     if(l <= start and end <= r)
//     {
//         return tree[node];
//     }
//     ll mid = (start + end) / 2;
//     ll p1 = query(2*node+1, start, mid, l, r);
//     ll p2 = query(2*node+2, mid+1, end, l, r);
//     return (p1 + p2);
// }

// void update(ll node, ll start, ll end, ll idx, ll val)
// {
//     if(start == end)
//     {
//         A[idx] = val;
//         tree[node] = val;
//     }
//     else
//     {
//         ll mid = (start + end) / 2;
//         if(start <= idx and idx <= mid)
//         {
//             update(2*node+1, start, mid, idx, val);
//         }
//         else
//         {
//             update(2*node+2, mid+1, end, idx, val);
//         }
//         tree[node] = tree[2*node+1] + tree[2*node+2];
//     }
// }


// ll fact[1000005];

// ll ncr(ll n,ll r){
//     ll ans = fact[n];
//     ll term = fact[n-r]*fact[r];
//     term%=mod;
//     term = mod_power(term,mod-2,mod);
//     ans*=term;
//     ans%=mod;
//     return ans;
// }

// ll vis[100005]={0};
// vector<ll> v[100005];


int main(){
    fast
    ll n;
    cin>>n;
    string s;
    cin>>s;
    ll c=0;
    FOR0(i,n-2)if(s[i]=='A'&&s[i+1]=='B'&&s[i+2]=='C')c++;
    cout<<c<<endl;
}




Measured memory_bytes: 256