#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <functional>

using namespace std;

#define int long long

#define fst first
#define scd second
#define PB push_back
#define MP make_pair
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define omajinai ios::sync_with_stdio(false);cin.tie(0)
#define rep(i,x) for(int i=0;i<(int)(x);++i)
#define rep1(i,x) for(int i=1;i<=(int)(x);++i)

typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;

template<typename T>T& max(T&a,T&b){if(a>=b)return a;return b;}
template<typename T>T& min(T&a,T&b){if(a<b)return a;return b;}
template<typename T>bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<typename T>bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
template<typename T>T get(){T a;cin>>a;return a;}
template<typename T>T rev(T a){reverse(all(a));return a;}
template<typename T>vector<T>&sort(vector<T>&a){sort(all(a));return a;}

const int inf = 1e9;
const ll linf = 3e18;
const double eps = 1e-9;

char S[100010];

int imosJ[100010];
int imosO[100010];
int imosI[100010];

int rev_imosJ[100010];
int rev_imosO[100010];
int rev_imosI[100010];

signed main()
{ // #define int long long ?????????????????§scanf???????????¨???????????????????????\?????????????????????
    omajinai;
    int N; cin >> N;

    rep(i, N) cin >> S[i];

    int ma = 0;

    { // 'J'
        imosJ[0] += 1;

        rep1(i, N) imosJ[i] += imosJ[i - 1] + (S[i - 1] == 'J');
        rep1(i, N) imosO[i] += imosO[i - 1] + imosJ[i - 1] * (S[i - 1] == 'O'); // "JO" ?????°
        rep1(i, N) imosI[i] += imosI[i - 1] + imosO[i - 1] * (S[i - 1] == 'I'); // "JOI" ?????°

        ma = max(ma, imosI[N]);
    }

    { // 'I'
        memset(imosJ, 0, sizeof(imosJ));
        memset(imosO, 0, sizeof(imosO));
        memset(imosI, 0, sizeof(imosI));

        imosI[N] += 1;

        for (int i = N - 1; i >= 0; --i) imosI[i] += imosI[i + 1] + (S[i] == 'I');
        for (int i = N - 1; i >= 0; --i) imosO[i] += imosO[i + 1] + imosI[i + 1] * (S[i] == 'O');
        for (int i = N - 1; i >= 0; --i) imosJ[i] += imosJ[i + 1] + imosO[i + 1] * (S[i] == 'J');

        ma = max(ma, imosJ[0]);
    }

    { // 'O'
        memset(imosJ, 0, sizeof(imosJ));
        memset(imosO, 0, sizeof(imosO));
        memset(imosI, 0, sizeof(imosI));
        
        rep1(i, N) imosJ[i] += imosJ[i - 1] + (S[i - 1] == 'J');
        rep1(i, N) imosO[i] += imosO[i - 1] + imosJ[i - 1] * (S[i - 1] == 'O'); // "JO" ?????°
        rep1(i, N) imosI[i] += imosI[i - 1] + imosO[i - 1] * (S[i - 1] == 'I'); // "JOI" ?????°

        int sum = imosI[N];

        for (int i = N - 1; i >= 0; --i) rev_imosI[i] += rev_imosI[i + 1] + (S[i] == 'I');
        for (int i = N - 1; i >= 0; --i) rev_imosO[i] += rev_imosO[i + 1] + rev_imosI[i + 1] * (S[i] == 'O');
        for (int i = N - 1; i >= 0; --i) rev_imosJ[i] += rev_imosJ[i + 1] + rev_imosO[i + 1] * (S[i] == 'J');

        rep(i, N) {
            ma = max(ma, sum + imosJ[i + 1] * rev_imosI[i]);
        }
    }

    cout << ma << endl;
}

Measured memory_bytes: 5984