#include <bits/stdc++.h> // 万能头文件,不知道的可以上网了解一下,超好用
using namespace std;
int n, sn[100005], si[100005]; // sn代表N在i之前的个数,si代表I在i之后的个数
long long maxn = -1;
string s; // NOI串
long long doing()
{
for (int i = 0; i <= n - 1; i++)
{
sn[i] = sn[i - 1] + (s.at(i) == 'N'); // 前缀和计算
}
for (int i = n - 1; i >= 0; i--)
{
si[i] = sn[i + 1] + (s.at(i) == 'I'); // 前缀和计算
}
long long sum = 0;
for (int i = 0; i <= n - 1; i++)
{
if (s.at(i) == 'O')
{
sum += sn[i] * si[i]; // 计算个数(注:因为s.at(i)在此处必定为O,所以使用sn[i]与si[i]、sn[i - 1]与si[i + 1]效果一样)
}
}
return sum;
}
int main()
{
cin >> n >> s;
for (int i = 0; i <= n - 1; i++)
{
sn[i] = sn[i - 1] + (s.at(i) == 'N'); // 前缀和计算
}
for (int i = n - 1; i >= 0; i--)
{
si[i] = sn[i + 1] + (s.at(i) == 'I'); // 前缀和计算
}
s.insert(0, 1, 'N');
maxn = max(maxn, doing());
s.erase(0, 1); // N情况
s.insert(s.length() - 1, 1, 'I');
maxn = max(maxn, doing());
s.erase(s.length() - 1, 1); // I情况
for (int i = 0; i <= n - 1; i++)
{
s.insert(i, 1, 'O');
maxn = max(maxn, doing());
s.erase(i, 1);
} // O情况
cout << maxn << endl;
return 0;
}